在Python中向列表添加额外元素的有效方法

Ami*_*mir 1 python performance list

我有列表列表,如:

[[0, 1, 2], 
 [3, 1], 
 [2, 0, 1], 
 [4, 3], 
 [1, 3, 4]]
Run Code Online (Sandbox Code Playgroud)

列表值介于0和5之间.现在我想要5+(每个列表中不存在5以下的数字).例如,在第一个列表中我们有0,1,2而我们没有3,4这样我们想要添加5 + 3 = 8和5 + 4 = 9所以最终他的新列表应该有0,1,2 ,8,9.最终的出局应该是:

[[0, 1, 2, 8, 9],
 [3, 1, 5, 7, 9],
 [2, 0, 1, 8, 9],
 [4, 3, 5, 6, 7],
 [1, 3, 4, 5, 7]]
Run Code Online (Sandbox Code Playgroud)

为此,我编写了以下python代码:

k = -1
for i in X1:
    k = k + 1
    for j in range(5, 10):        
        if j - 5 not in i:
            X[k].append(j)
Run Code Online (Sandbox Code Playgroud)

但是对于大型数据集(列表),这需要永远.我想知道是否有更有效的方法/建议我可以用于这种情况?

Mos*_*oye 6

运行in的每个检查(名单为O(n)操作)j-5嵌套循环(一个O(n×m的)操作)内减慢你的代码的性能-因为查找是缓慢和香草用于在Python循环是不便宜.

您可以简单地设置差异并添加5,然后使用结果扩展内部列表:

st = set(range(5)) 
for l in X1:
    l.extend(sorted([x+5 for x in st.difference(l)]))
print(X1)
Run Code Online (Sandbox Code Playgroud)

如果你实际上不需要对你要追加的新项目进行排序,那么你会更快,因为内部列表无论如何都没有排序,因为排序会增加额外的O(nlogn)复杂度.

另外,对于在列表循环理解的运行速度比for循环香草更快,所以我可以说的嵌套的挂钟时间在这里的表现比原来好多了.

设定差异输出重复执行,list.__contains__而单个list.extend也输出重复执行list.append.


[[0, 1, 2, 8, 9], 
 [3, 1, 5, 7, 9], 
 [2, 0, 1, 8, 9], 
 [4, 3, 5, 6, 7], 
 [1, 3, 4, 5, 7]]
Run Code Online (Sandbox Code Playgroud)