例如,如果输入列表为
[1, 2, 3, 4]
我希望输出结果为。[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
如果可能的话,我想要一种比使用两个for循环的蛮力方法更好的解决方案。我该如何实现?
[1, 2, 3, 4]
我希望输出结果为。[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
如果可能的话,我想要一种比使用两个for循环的蛮力方法更好的解决方案。我该如何实现?
itertools.combinations
可以实现此目的。>>> import itertools
>>> x = [1,2,3,4]
>>> list(itertools.combinations(x, 2))
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
与其他结果相比:
>>> list(itertools.permutations(x, 2))
[(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
import itertools
x = [1,2,3,4]
for each in itertools.permutations(x,2):
print(each)
print(*itertools.permutations(x, 2))
print(*itertools.permutations(x, 2))
,这甚至更短。 - ForceBrupermutations
返回一个迭代器,但我相信解包它会创建一个(可能很大的)对象,这实际上可能会减慢整个过程(特别是如果需要交换)。 - lungjitertools.combinations
,否则此方法无法产生所需的输出。 - Stop harming Monicatimeit
运行了一个基准测试,使用 for 循环进行比较,并将其与无操作的元组解包版本进行了比较(因为我猜测 OP 并不仅仅是要打印出每个值)。在使用 x = list(range(5000))
创建的列表上,元组解包版本在我的计算机上运行速度比未解包版本慢 3 倍。然而,对于小型列表,调用我的无操作函数所产生的开销超过了为整个元组分配内存的成本。 - lungj
2^n
这个数字?有序对是 4! / (4 - 2)!(等于12),而无序对则是 4 选 2(等于6)。 - brianpck