复制迭代器并生成无序自笛产品

时间:2011-03-11 01:14:29

标签: python list iterator cartesian-product

假设我有一个列表,并且我想生成所有唯一元素对的列表,而不考虑订单。一种方法是:

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

但这甚至都行不通。什么是更加pythonic和有效的方式,使用迭代器或zip等?

2 个答案:

答案 0 :(得分:7)

这已经完成,并且从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()函数也会返回一个迭代器,以便您可以立即开始打印它们。请参阅docs

此外,您将结果称为列表与其自身之间的笛卡尔积,但这并非严格正确:笛卡尔积将具有16个元素(4x4)。您的输出是其中的一个子集,即只有列表值的2元素combinations(不允许重复)。

答案 1 :(得分:0)

@Cameron的回答是正确的。

我只想指出

for i in range(len(mylist)):
    do_something_to(mylist[i])

纯粹是非Pythonic;如果您的操作是只读的(不必存储回数组),请执行

for i in mylist:
    do_something_to(i)

,否则

mylist = [do_something_to(i) for i in mylist]