12

リストのリストと次のような区切り文字列があります。

lists = [
    ['a', 'b'],
    [1, 2],
    ['i', 'ii'],
]
separator = '-'

結果として、サブリスト内の文字列からの区切り文字列と組み合わせた文字列のリストが必要です。

result = [
    'a-1-i', 
    'a-1-ii', 
    'a-2-i', 
    'a-2-ii',
    'b-1-i', 
    'b-1-ii', 
    'b-2-i', 
    'b-2-ii',
]

結果の順序は関係ありません。

これどうやってするの?

4

5 に答える 5

17
from itertools import product
result = [separator.join(map(str,x)) for x in product(*lists)]

itertools.product提供されたイテラブルのデカルト積を生成するイテレータを返します。map str一部の値は int であるため、結果のタプルをオーバーする必要があります。最後に、文字列化されたタプルを結合し、すべてをリスト内包表記 (または大規模なデータセットを処理する場合はジェネレーター式であり、反復のために必要な場合) 内にスローします。

于 2012-10-09T07:29:55.220 に答える
3
>>> from itertools import product
>>> result = list(product(*lists))
>>> result = [separator.join(map(str, r)) for r in result]
>>> result
['a-1-i', 'a-1-ii', 'a-2-i', 'a-2-ii', 'b-1-i', 'b-1-ii', 'b-2-i', 'b-2-ii']

@jpmが指摘しているようlistに、productジェネレーターにキャストする必要はありません。コンソールで結果を確認するためにこれらを持っていましたが、ここでは実際には必要ありません。

于 2012-10-09T07:31:29.790 に答える
3

ビルトインでこれを行うことができます:

>>> map(separator.join, reduce(lambda c,n: [a+[str(b)] for b in n for a in c], lists, [[]]))
['a-1-i', 'b-1-i', 'a-2-i', 'b-2-i', 'a-1-ii', 'b-1-ii', 'a-2-ii', 'b-2-ii']
于 2012-10-09T11:46:29.167 に答える
1
["%s%c%s%c%s" % (a, separator, b, separator, c) for a in lists[0] for b in lists[1] for c in lists[2]]
于 2012-10-09T07:32:22.287 に答える