リスト内包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']]