小能豆

复制迭代器并产生组合

py

假设我有一个列表,我想生成一个包含所有唯一元素对的列表,而不考虑顺序。一种方法是:

mylist = ['W','X','Y','Z']
for i in xrange(len(mylist)):
    for j in xrange(i+1,len(mylist)):
        print mylist[i],mylist[j]
W X
W Y
W Z
X Y
X Z
Y Z

我想用迭代器来做到这一点,我想到以下内容,即使它不够简洁:

import copy
it1 = iter(mylist)
for a in it1:
    it2 = copy.copy(it1)
    for b in it2:
        print a,b

但这根本不起作用。有什么更符合 Python 风格、更高效的方法可以做到这一点,使用迭代器还是 zip 等?


阅读 10

收藏
2025-01-11

共1个答案

小能豆

这已经完成并且已包含在 Python 2.6 的标准库中:

import itertools

mylist = ['W', 'X', 'Y', 'Z']
for pair in itertools.combinations(mylist, 2):
    print pair        # pair is a tuple of 2 elements

我觉得很 Pythonic ;-)

请注意,即使您正在计算很多组合,该combinations()函数也会返回一个迭代器,以便您可以立即开始打印它们。请参阅文档

另外,您将结果称为列表与其本身之间的笛卡尔积,但这并不完全正确:笛卡尔积将有 16 个元素 (4x4)。您的输出是它的一个子集,即仅是列表值的 2 个元素组合(不允许重复)。

2025-01-11