2

リストがあり、順序を考慮せずにすべての一意の要素のペアのリストを作成したいとします。これを行う1つの方法は次のとおりです。

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

しかし、これも機能しません。イテレータやzipなどを使用して、これを行うためのよりPython的で効率的な方法は何ですか?

4

2 に答える 2

8

これはすでに行われており、Python2.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要素の組み合わせ(繰り返しは許可されません)のみです。

于 2011-03-11T01:17:37.890 に答える
0

@キャメロンの答えは正しいです。

私はそれを指摘したかっただけです

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]
于 2011-03-11T01:41:56.283 に答える