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

时间:2017-11-20 17:39:05

标签: python performance list

我有以下列表:

[[0, 1, 2], 
 [3, 1], 
 [2, 0, 1], 
 [4, 3], 
 [1, 3, 4]]

列表值介于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]]

为此,我编写了以下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)

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

2 个答案:

答案 0 :(得分:6)

对嵌套循环中的每个in运行j-5检查(列表的O(n)操作)(O(nxm)操作)会降低代码的性能 - 因为查找很慢,Python中的 for 循环并不便宜。

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

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

如果您实际上不需要对要添加的新项目进行排序,那么您的速度会快得多,因为内部列表无论如何都不会排序,因为排序会引发额外的O(nlogn) )复杂性。

此外,列表推导中的 for 循环比vanilla 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]]

答案 1 :(得分:1)

  

使用One line解决方案的一个循环:

您的工作只能使用一个循环完成,以下两种方法只能在一个循环中完成您的工作:

  

使用map函数的第一种方法:

[large[i].extend(map(lambda x: x + 5, list({0, 1, 2, 3, 4} - set(j)))) for i,j in enumerate(large)]

print(large)

输出:

[[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]]
  

使用numpy的第二种方法:

import numpy as np


[large[i].extend(np.asarray(list({0, 1, 2, 3, 4} - set(j))) + 5) for i,j in enumerate(large)]

print(large)

输出:

[[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]]