Python 如果嵌套列表中不存在元素,如何有效地检查和添加?

Python 如果嵌套列表中不存在元素,如何有效地检查和添加?,python,python-3.x,list,list-comprehension,Python,Python 3.x,List,List Comprehension,我有一个巨大的嵌套列表,其中的元素是具有以下形式的字符串: [[0,'+','the','+','quick','+','brown','+','fox','+','jumps','over','+','the','+','lazy','+','dog','+',908] ..., ['Now','+','is','+', 'the','+', 'time','+', 'for','+', 'all','+', 67,'+', 'men']] 但是,我发现有些元素没有+分隔符。例如,在子列表1

我有一个巨大的嵌套列表,其中的元素是具有以下形式的字符串:

[[0,'+','the','+','quick','+','brown','+','fox','+','jumps','over','+','the','+','lazy','+','dog','+',908]
...,
['Now','+','is','+', 'the','+', 'time','+', 'for','+', 'all','+', 67,'+', 'men']]
但是,我发现有些元素没有+分隔符。例如,在子列表1中:

[0,'+','the','+','quick','+','brown','+','fox','+','jumps','over','+','the','+','lazy','+','dog','+',908]
在“跳跃”之间,缺少“+”。对于具有长子列表的大型嵌套列表,在没有分隔符的元素之间添加+分隔符的最有效方法是什么

预期输出应如下所示:

[[0,'+','the','+','quick','+','brown','+','fox','+','jumps','+','over','+','the','+','lazy','+','dog','+',908]
    ...,
    ['Now','+','is','+', 'the','+', 'time','+', 'for','+', 'all','+', 67,'+', 'men']]
有点贪婪:

cleansed_lists = [[word for word in sentence if word != '+'] for sentence in nested_list]
result = []
for sentence in cleansed_lists:
    new_list = ['+'] * (2 * len(sentence) - 1)
    new_list[::2] = sentence
    result.append(new_list)
时间复杂性:

假设N是外部列表的长度,N是每个内部列表和句子的平均长度

第1行:我们使用O1操作,即if word!='+',遍历外部列表一次,遍历每个内部列表一次。因此,第1行的时间复杂度为On*N

第3-6行:我们在外部列表第3行迭代一次,相当于一个列表的大小是内部列表第4行的两倍,列表的其他元素的大小是内部列表第5行的两倍。这将产生ON*2n+n的时间复杂度,这将简化为ON*n

因此,最后的复杂性是*N.

有点贪婪:

cleansed_lists = [[word for word in sentence if word != '+'] for sentence in nested_list]
result = []
for sentence in cleansed_lists:
    new_list = ['+'] * (2 * len(sentence) - 1)
    new_list[::2] = sentence
    result.append(new_list)
时间复杂性:

假设N是外部列表的长度,N是每个内部列表和句子的平均长度

第1行:我们使用O1操作,即if word!='+',遍历外部列表一次,遍历每个内部列表一次。因此,第1行的时间复杂度为On*N

第3-6行:我们在外部列表第3行迭代一次,相当于一个列表的大小是内部列表第4行的两倍,列表的其他元素的大小是内部列表第5行的两倍。这将产生ON*2n+n的时间复杂度,这将简化为ON*n

因此,最后的复杂度为*N

输出

[[0, '+', 'the', '+', 'quick', '+', 'brown', '+', 'fox', '+', 'jumps', '+', 'over', '+', 'the', '+', 'lazy', '+', 'dog', '+', 908, '+'], ['Now', '+', 'is', '+', 'the', '+', 'time', '+', 'for', '+', 'all', '+', 67, '+', 'men', '+']]
输出

[[0, '+', 'the', '+', 'quick', '+', 'brown', '+', 'fox', '+', 'jumps', '+', 'over', '+', 'the', '+', 'lazy', '+', 'dog', '+', 908, '+'], ['Now', '+', 'is', '+', 'the', '+', 'time', '+', 'for', '+', 'all', '+', 67, '+', 'men', '+']]

我尝试了两种方法,但没有大型嵌套列表:

数据=[0'+'、'the'、'+'、'quick'、'+'、'brown'、'+'、'fox'、'+', ‘跳跃’、‘越过’、‘+’、‘the’、‘+’、‘lazy’、‘+’、‘dog’、‘+’、908] 定义功能1: 对于范围1中的i,lendata,2: 如果数据[i]!='+': data.inserti,“+” def func_2: real_data=[val表示数据中的val,如果val!='+'] 拆分器='+'*lenreal_数据 [i代表Ziperal_数据中的ab,拆分器代表ab中的i][:-1] %时间功能1 %timeit func_2 最终结果是:

981 ns ± 17.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
3.24 µs ± 101 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

也许你可以试试~祝你好运

我尝试了两种方法,但没有大型嵌套列表:

数据=[0'+'、'the'、'+'、'quick'、'+'、'brown'、'+'、'fox'、'+', ‘跳跃’、‘越过’、‘+’、‘the’、‘+’、‘lazy’、‘+’、‘dog’、‘+’、908] 定义功能1: 对于范围1中的i,lendata,2: 如果数据[i]!='+': data.inserti,“+” def func_2: real_data=[val表示数据中的val,如果val!='+'] 拆分器='+'*lenreal_数据 [i代表Ziperal_数据中的ab,拆分器代表ab中的i][:-1] %时间功能1 %timeit func_2 最终结果是:

981 ns ± 17.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
3.24 µs ± 101 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

也许你可以试试~祝你好运

这看起来是个小问题,你试过什么了吗?消除所有“+”并相应地处理列表不是更容易吗?如果原始列表中有+、+、+怎么办?因为您使用的是列表,所以没有真正有效的方法。迭代列表并将每个项与其相邻项进行比较。请确保从列表末尾开始迭代并向后,这样在插入加号时,不会打乱其余列表项的索引值。当然,应该将其规范化为一个+@complementdphenomenon,这是一个简单的解决方案。但是,还有其他方法吗@这看起来是个小问题,你试过什么了吗?消除所有“+”并相应地处理列表不是更容易吗?如果原始列表中有+、+、+怎么办?因为您使用的是列表,所以没有真正有效的方法。迭代列表并将每个项与其相邻项进行比较。请确保从列表末尾开始迭代并向后,这样在插入加号时,不会打乱其余列表项的索引值。当然,应该将其规范化为一个+@complementdphenomenon,这是一个简单的解决方案。但是,还有其他方法吗@Selcukhow效率是多少?@anon添加的时间复杂度分解效率是多少?@anon添加的时间复杂度分解