假设我有一个列表,我想生成一个包含所有唯一元素对的列表,而不考虑顺序。一种方法是:
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 等?
这已经完成并且已包含在 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()函数也会返回一个迭代器,以便您可以立即开始打印它们。请参阅文档。
combinations()
另外,您将结果称为列表与其本身之间的笛卡尔积,但这并不完全正确:笛卡尔积将有 16 个元素 (4x4)。您的输出是它的一个子集,即仅是列表值的 2 个元素组合(不允许重复)。