2017-04-16 50 views
1

私は組み合わせに基づいて質問をしています。そして、はい、私はPythonであまり良くありません。Python itertoolsの組み合わせの組み合わせ

ncrを使用したitertoolsの組み合わせ関数は、nからr個の可能な組み合わせを返すだけです。私は選択されたr個の可能な組み合わせとその反復で選択されなかったn個の残りの要素を返すものを求めます。

例:[2, 4]が選択されている場合

>>>from itertools import combinations 
>>>list = [1, 2, 3, 4, 5] 
>>>rslt = combinations(list, 2) 

それはまた[1, 3, 5] を返す必要がありますので、事前に

[[2, 4], [1, 3, 5]]などのおかげ

答えて

1

itertools.combinations

のRetを返す必要があります入力反復可能要素からの要素の部分列。

は、あなたが他の項目[j for j in l if j not in i]取得するには、リストの内包表記を使用することができます。

from itertools import combinations 

l = [1, 2, 3, 4, 5] 

for i in combinations(l,2): 
    print(list(i),[j for j in l if j not in i]) 

をそして、あなたが得る:ところで

[1, 2] [3, 4, 5] 
[1, 3] [2, 4, 5] 
[1, 4] [2, 3, 5] 
[1, 5] [2, 3, 4] 
[2, 3] [1, 4, 5] 
[2, 4] [1, 3, 5] 
[2, 5] [1, 3, 4] 
[3, 4] [1, 2, 5] 
[3, 5] [1, 2, 4] 
[4, 5] [1, 2, 3] 

、使用することをお勧めしませんlistを変数名として使用します。

+0

これは1つのラインリストの理解で行うことができますか? – Arman

+1

@Arman '(リスト(i)、(jの場合はjはiがjにない場合はi)] iの組み合わせ(l、2)] – McGrady

+0

ありがとう、変数名として使用しないでください – minhaj

1

組み合わせにある要素を除去し、元のリストのコピーを作成することで最も簡単な方法:

from itertools import combinations 
def combinations_and_remaining(l, n): 
    for c in combinations(l, n): 
     diff = [i for i in l if i not in c] 
     yield c, diff 

for i in combinations_and_remaining([1, 2, 3, 4, 5], 2): 
    print(i) 

ウィル出力

((1, 2), [3, 4, 5]) 
((1, 3), [2, 4, 5]) 
((1, 4), [2, 3, 5]) 
((1, 5), [2, 3, 4]) 
((2, 3), [1, 4, 5]) 
((2, 4), [1, 3, 5]) 
((2, 5), [1, 3, 4]) 
((3, 4), [1, 2, 5]) 
((3, 5), [1, 2, 4]) 
((4, 5), [1, 2, 3]) 

(組み合わせはタプルを返し、残り要素は効率のためのリストとして返されます)

0

少し贅沢ですが楽しい方法は、を2回使用することです:

from itertools import combinations 
n = 5 
k = 2 
lst = list(range(1, n+1)) 
rslt = zip(combinations(lst, k), map(tuple, reversed(list(combinations(lst, n-k))))) 
print(list(rslt)) 
# -> [((1, 2), (3, 4, 5)), ((1, 3), (2, 4, 5)), ((1, 4), (2, 3, 5)), 
#  ((1, 5), (2, 3, 4)), ((2, 3), (1, 4, 5)), ((2, 4), (1, 3, 5)), 
#  ((2, 5), (1, 3, 4)), ((3, 4), (1, 2, 5)), ((3, 5), (1, 2, 4)), 
#  ((4, 5), (1, 2, 3))]