【发布时间】:2021-06-27 13:05:14
【问题描述】:
以下代码有多个循环,我想减少它以优化时间复杂度。
for a in file1:
if a[0] in [i[1] for i in file2]:
for b in file2:
if a[0] == b[1]:
c.append(int(b[0]))
continue
else:
# do stuff
我尝试了以下方法以提高效率。虽然,我找不到 if 语句的替代方法。
for a, b in zip(file1, file2):
if a[0] in [i[1] for i in file2]:
if a[0] == b[1]:
c.append(int(b[0]))
continue
else:
# do stuff
此外,两种操作的输出也不同。第一段代码确实显示了正确的结果。
【问题讨论】:
-
第一个代码示例对
file2进行了两次迭代,这似乎很浪费。您不妨删除第一个if语句。 -
请注意,'zip' 给了我们配对。令 a=[1,2,3], b = ['a', 'b', 'c'],然后 list(zip(a,b)) = [(1,'a'), (2, 'b'), (3,'c')]。如果您需要使用更少的循环来重写代码(但为什么?...),请尝试使用 itertools.product 而不是 zip。然后请注意,如果您的第一个“if”没有用,只会增加评估时间:您循环 file2 两次,首先确定是否有任何元素适合,然后再找到它。然后在第一个 sn-p 中“继续”什么都不做,它在循环的末尾。而且这段代码总是 O(n^2) 或更多,因为你需要遍历每对元素。
标签: python functional-programming itertools