これを考える最も簡単な方法は、リストより1つ短い長さですべての組み合わせを反復処理することです。これを行うには、次を使用できますitertools.combinations()
。
import itertools
color = ["red","blue","red","green","blue"]
for rest in itertools.combinations(color, len(color)-1):
print(rest)
それは私たちに与えます:
('red', 'blue', 'red', 'green')
('red', 'blue', 'red', 'blue')
('red', 'blue', 'green', 'blue')
('red', 'red', 'green', 'blue')
('blue', 'red', 'green', 'blue')
これは、シーケンスだけでなく反復可能オブジェクトでも機能し、非常に読みやすく、優れた高速であるため、優れたソリューションです。
現在の値も必要な場合はcombinations()
、予測可能な順序で簡単に取得できるため、両方を同時に繰り返すだけzip()
です(当然、最高のパフォーマンスが必要な場合は、itertools.izip()
Python2.xで使用します。 aszip()
はリストを作成しますが、3.xのようなジェネレーターではありません)。
import itertools
color = ["red","blue","red","green","blue"]
for c, rest in zip(color, itertools.combinations(reversed(color), len(color)-1)):
print(c, rest)
red ('blue', 'green', 'red', 'blue')
blue ('blue', 'green', 'red', 'red')
red ('blue', 'green', 'blue', 'red')
green ('blue', 'red', 'blue', 'red')
blue ('green', 'red', 'blue', 'red')
ここでは、入力を逆にしてcomibinations()
、左から右に機能するようにします。代わりに、右から左に逆color
にすることができます。zip()
つまり、そうです、要するに、これは1行のソリューションです(インポートを数えると2つです)。