我有如下列表:
[[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)
然而,对于大型数据集(列表),这需要永远。我想知道是否有任何更有效的方法/建议可以用于这种情况?
请您参考如下方法:
在嵌套循环(O(nxm) 操作)中为每个 j-5 运行 in 检查(列表的 O(n) 操作)会减慢速度代码的性能 - 因为查找很慢,而且 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 循环比普通的 for 循环运行得更快,所以我可以说这里嵌套的 wall time 性能比原来的要好得多。
set difference 优于 repeatedlist.__contains__ 而单个 list.extend 也优于 repeated 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]]
