我有以下列表:
[[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)
然而,对于大型数据集(列表),这需要永远。我想知道是否有更有效的方法/建议我可以用于这种情况?
答案 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]]