我有以下代码:
nums = [1, 2, 23, 1, 2, 3, ..., 10] # a lot of elements
for i, num1 in enumerate(nums):
for j, num2 in enumerate(nums):
if (i >= j):
continue
# do something
我相信我们会在这里迭代N^2
对,是否有任何方法可以从j
开始i + 1
来减少一半的操作?>
答案 0 :(得分:1)
您可以使用itertool.combinations获得相同的元素组合。这可能是一个更干净的选择,并且避免在列表中占一小部分:
from itertools import product, combinations
nums = [1, 2, 3, 4] # a lot of elements
for num1, num2 in combinations(nums,2):
print(num1, num2) # or do something else
1 2
1 3
1 4
2 3
2 4
3 4
答案 1 :(得分:0)
我可以使用切片(这个想法是@Carcigenicate给出的):
nums = [1, 2, 23, 1, 2, 3, ..., 10] # a lot of elements
for i, num1 in enumerate(nums):
for j, num2 in enumerate(nums[i+1:]):
# do something
答案 2 :(得分:0)
您可以先对列表进行切片,然后再将其枚举:
nums = [1, 2, 23, 1, 2, 3, ..., 10] # a lot of elements
for i, num1 in enumerate(nums):
for j, num2 in enumerate(nums[i+1:]):
# do something
如果您不熟悉切片,可以使用它指定元素的子集:
>>> nums = [1, 2, 3, 4, 5]
>>> i = 2
>>> nums[i:]
[3, 4, 5]
尽管我提醒您,这不会降低您算法的整体复杂性。