1

一連の数字を入力するプログラムを実行しており、そのうちの 6 つを使用して宝くじ番号のさまざまな組み合わせを作成しています。さまざまな組み合わせを作成するときに、重複を削除して、各組み合わせが一度だけ印刷されるようにします。これが私がしたいことです:

combo_list = [1 2 3 4 5 6 7]

出力は次のようになります。

1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7

私が使用しているコードは次のとおりです。

   final = []
    for sublist in combo_list:
        if sublist not in final:
            final.append(sublist)
    for item in final:
        item = (sorted(item, key=int))
        print (' '.join(str(n) for n in item))

ただし、コードを使用すると、多くの重複を含む出力が得られます。

1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 5 6
1 2 3 4 6 7
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 5 6
1 2 3 5 6 7
1 2 3 4 5 7
1 2 3 5 6 7
1 2 3 4 5 6
1 2 3 4 6 7
1 2 3 4 5 6
1 2 3 5 6 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 4 5 7
1 2 3 5 6 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 3 4 5 6
.
.
.

組み合わせごとに1回だけ印刷するために何を変更する必要があるかについてのアイデアはありますか?

4

5 に答える 5

5

これに使用itertools.combinations()します:

import itertools as it
ans = it.combinations([1, 2, 3, 4, 5, 6, 7], 6)

結果は次のとおりです。

list(ans)

=> [(1, 2, 3, 4, 5, 6), (1, 2, 3, 4, 5, 7),
    (1, 2, 3, 4, 6, 7), (1, 2, 3, 5, 6, 7),
    (1, 2, 4, 5, 6, 7), (1, 3, 4, 5, 6, 7),
    (2, 3, 4, 5, 6, 7)]

後で数字を印刷する必要がある場合は、簡単です。

for r in ans:
    print ' '.join(str(s) for s in r) 

=> 1 2 3 4 5 6
   1 2 3 4 5 7
   1 2 3 4 6 7
   1 2 3 5 6 7
   1 2 4 5 6 7
   1 3 4 5 6 7
   2 3 4 5 6 7
于 2013-05-27T02:37:09.140 に答える
0

次に、ソースをitertools.combinationsに持っていくことができます:

def lotto(iterable, r):
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = range(r)
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)

print list(lotto([1, 2, 3, 4, 5, 6, 7], 6))   
于 2013-05-27T03:19:13.517 に答える
0

重複を単純に削除したいというあなたの欲求に基づいて.. python setを使用してください

   final = []
    for sublist in combo_list:
        if sublist not in final:
            final.append(sublist)
    for item in set(tuple(x) for x in final):
        item = (sorted(item, key=int))
        print (' '.join(str(n) for n in item))

しかし、FWIW - @Óscar López の回答を使用してホイールを再作成する理由 ;)

HTH

于 2013-05-27T03:20:22.370 に答える
0
 comb_list= range(1, 8)
 rip_idx = 6
 for idx in range(len(comb_list)):
    final = comb_list[0:rip_idx -idx ] + comb_list[rip_idx- idx + 1: ]
    print final

ライブラリなしで解決する簡単な方法

于 2013-05-27T03:30:50.453 に答える