0

たとえば、他のリストといくつかのゼロで構成されるリストがあります。

x = [[1, 1, 2], [1, 1, 1, 2], [1, 1, 2], 0, 0, 0]

内側のリストの順序を変えずに、このリストのすべての組み合わせを生成したいので、

[[1, 1, 2], 0, 0, [1, 1, 1, 2], [1, 1, 2], 0]

大丈夫ですが、

[[1, 1, 1, 2], [1, 1, 2], 0, 0, [1, 1, 2], 0]

そうではありません。これは Python ではかなり簡単なはずですが、そうは思いません。誰か助けてくれませんか?

4

3 に答える 3

2

私は次のようなことをします...:

>>> import itertools
>>> x = [[1, 1, 2], [1, 1, 1, 2], [1, 1, 2], 0, 0, 0]
>>> numzeros = x.count(0)
>>> listlen = len(x)
>>> where0s = itertools.combinations(range(listlen), numzeros)
>>> nonzeros = [y for y in x if y != 0]
>>> for w in where0s:
...   result = [0] * listlen
...   picker = iter(nonzeros)
...   for i in range(listlen):
...     if i not in w:
...       result[i] = next(picker)
...   print result
... 
[0, 0, 0, [1, 1, 2], [1, 1, 1, 2], [1, 1, 2]]
[0, 0, [1, 1, 2], 0, [1, 1, 1, 2], [1, 1, 2]]
[0, 0, [1, 1, 2], [1, 1, 1, 2], 0, [1, 1, 2]]
[0, 0, [1, 1, 2], [1, 1, 1, 2], [1, 1, 2], 0]
[0, [1, 1, 2], 0, 0, [1, 1, 1, 2], [1, 1, 2]]
[0, [1, 1, 2], 0, [1, 1, 1, 2], 0, [1, 1, 2]]
[0, [1, 1, 2], 0, [1, 1, 1, 2], [1, 1, 2], 0]
[0, [1, 1, 2], [1, 1, 1, 2], 0, 0, [1, 1, 2]]
[0, [1, 1, 2], [1, 1, 1, 2], 0, [1, 1, 2], 0]
[0, [1, 1, 2], [1, 1, 1, 2], [1, 1, 2], 0, 0]
[[1, 1, 2], 0, 0, 0, [1, 1, 1, 2], [1, 1, 2]]
[[1, 1, 2], 0, 0, [1, 1, 1, 2], 0, [1, 1, 2]]
[[1, 1, 2], 0, 0, [1, 1, 1, 2], [1, 1, 2], 0]
[[1, 1, 2], 0, [1, 1, 1, 2], 0, 0, [1, 1, 2]]
[[1, 1, 2], 0, [1, 1, 1, 2], 0, [1, 1, 2], 0]
[[1, 1, 2], 0, [1, 1, 1, 2], [1, 1, 2], 0, 0]
[[1, 1, 2], [1, 1, 1, 2], 0, 0, 0, [1, 1, 2]]
[[1, 1, 2], [1, 1, 1, 2], 0, 0, [1, 1, 2], 0]
[[1, 1, 2], [1, 1, 1, 2], 0, [1, 1, 2], 0, 0]
[[1, 1, 2], [1, 1, 1, 2], [1, 1, 2], 0, 0, 0]
>>> 

もちろん、さまざまな方法でマイクロ最適化できますが、一般的な考え方が明確であることを願っています。ゼロを持つ可能性のあるすべてのインデックスセットを特定し、元のリストのゼロ以外の項目を他の場所に並べます。

于 2010-05-31T16:25:22.647 に答える
2

1 つのヒント: z 個のゼロと t 個のリストがある場合、記述する組み合わせの数は(z+t, z)を選択することです。(星と棒のトリックは、それが正しい理由を理解するのに役立ちます。)

これらの組み合わせを生成するには、{1,...,z+t} の長さ z のすべてのサブセットを生成できます。それらのそれぞれは、ゼロの位置を示します。

さらに良いことに、これがあなたの質問の一般化です:

https://stackoverflow.com/questions/2944987/all-the-ways-to-intersperse

入力 x は、次のように上記の一般化に適した形式 y に変換できます。

x = [[1,1,2], [1,1,1,2], [1,1,2], 0, 0, 0]
lists = [i for i in x if i != 0]
zeros = [i for i in x if i == 0]
y = [lists, zeros]
于 2010-05-31T16:11:00.803 に答える
0

Python 2.6 では、

import itertools

def intersperse(x, numzeroes):
    for indices in itertools.combinations(range(len(x) + numzeroes), numzeroes):
        y = x[:]
        for i in indices:
            y.insert(0, i)
        yield y

x = [[1, 1, 2], [1, 1, 1, 2], [1, 1, 2]]
list(intersperse(x, 3))
于 2010-05-31T15:56:22.490 に答える