1

現在、選択肢のリストがあります:

a = ['D1', 
    'C1', 
    'D2', 
    'C2', 
    'D3', 
    'C3', 
    'D4', 
    'C4', 
    'D5', 
    'C5',]

可能な組み合わせの中にネストされたリストを持つ新しいリストが必要です。このような:

b = [
'D1', 
'C1', 
'D2', 
'C2', 
'D3', 
'C3', 
'D4', 
'C4', 
'D5', 
'C5',
['D1', 'C1'], 
['D1', 'D2'], 
['D1', 'C2'] 
.
. 
['D1', 'C1', 'D2'] 
.
. 
['D1', 'C1', 'D2', 'C2'] 
.
. 
['D1', 'C1', 'D2', 'C2', 'D3']
:
etc
4

4 に答える 4

2

チェックアウトitertools.combinations

b = []
for len_ in xrange(len(a)):
    b.extend(itertools.combinations(a, len_+1)

itertoolsドキュメントのパワーセットレシピも参照してください。

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
于 2013-02-27T17:57:08.210 に答える
2

あなたは実際にaここのパワーセットが私の解決策である必要があります:

def powerset(seq):
    """
    Returns all the subsets of this set. This is a generator.
    """
    if len(seq) <= 1:
        yield seq
        yield []
    else:
        for item in powerset(seq[1:]):
            yield [seq[0]]+item
            yield item

a =['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5']
b = [x for x in powerset(a)]
b.sort(key = len)
for x in b:
 print x

私の参照サイト:そして、ここのcodepadeで見ることができるその作業

run のインスタンスを 編集します。

a =['D1', 'C1', 'D2']
b = [x for x in powerset(a)]
b.sort(key = len)
for x in b:
  print x

そしてその出力:

[]
['D2']
['C1']
['D1']
['C1', 'D2']
['D1', 'D2']
['D1', 'C1']
['D1', 'C1', 'D2']

次のリンクから、Python での Powerset のより良いコードを見つけることができます。

http://docs.python.org/2/library/itertools.html
http://mail.python.org/pipermail/tutor/2004-April/029413.html
http://ruslanspivak.com/2011/06/ 09/power-set-generation-a-joy-of-python/

martineau 氏は小さくて高速なコードを提供してくれましたが、私は itertools をまだ理解していません。

于 2013-02-27T18:00:47.473 に答える
2

リスト内包itertools.combinations表記 と呼ばれる非常に効率的で比較的簡潔な構造と組み合わせて使用​​して、新しいリストを作成できます。ただし、これを行うには、最終的なリスト内のすべての項目自体ネストされたリストではないという事実によって、部分的に少し複雑になりました。実際、そのようにすると、後でリストを処理するのが難しくなると思いますが、とにかく、あなたが望んでいたリストを正確に生成する、私が考案できた最も単純な実装を次に示します。

from itertools import combinations

a = ['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5']
b = [item for sublist in (list(combo[0] if len(combo) < 2 else list(combo)
                               for combo in combinations(a, n))
                                   for n in range(1, len(a)+1)) for item in sublist]

from pprint import pprint  # print the result
print 'b = \\'
pprint(b[:14] + ['... lines omitted ...'] + b[-14:])

出力:

b = \
['D1',
 'C1',
 'D2',
 'C2',
 'D3',
 'C3',
 'D4',
 'C4',
 'D5',
 'C5',
 ['D1', 'C1'],
 ['D1', 'D2'],
 ['D1', 'C2'],
 ['D1', 'D3'],
 '... lines omitted ...',
 ['C1', 'D2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
 ['C1', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
 ['D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
 ['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5'],
 ['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'C5'],
 ['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'D5', 'C5'],
 ['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'C4', 'D5', 'C5'],
 ['D1', 'C1', 'D2', 'C2', 'D3', 'D4', 'C4', 'D5', 'C5'],
 ['D1', 'C1', 'D2', 'C2', 'C3', 'D4', 'C4', 'D5', 'C5'],
 ['D1', 'C1', 'D2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
 ['D1', 'C1', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
 ['D1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
 ['C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
 ['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5']]
于 2013-02-27T17:59:31.240 に答える
1

を使用することをお勧めしitertools.permutations(a)ます。

import itertools
a = ['D1', 
    'C1', 
    'D2', 
    'C2', 
    'D3', 
    'C3', 
    'D4', 
    'C4', 
    'D5', 
    'C5',]

b = list(itertools.permutations(a)) # this gives permutations of the same length

可能なすべての順列 (さまざまな長さ) が必要な場合は、forループを使用できます。

b = []
for i in range(1, len(a)+1):
    b.extend(list(itertools.permutations(a, i)))

それをリスト内包表記に入れます:

b = [list(itertools.permutations(x, i)) for i in range(1, len(x)+1)]
于 2013-02-27T17:57:59.837 に答える