我有一个由其他列表和一些零组成的列表,例如:
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中应该相当容易,但我只是看不到它。有人可以帮帮我吗?
答案 0 :(得分:2)
一个提示:如果有z个零和t列表,那么你描述的组合数是choose(z + t,z)。 (stars and bars技巧将有助于了解为什么这是真的。)
要生成这些组合,您可以生成{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]
答案 1 :(得分: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]
>>>
当然,可以通过多种方式进行微观优化,但我希望一般的想法是明确的:确定可能有零的所有索引集,并将原始列表的非零项放在其他地方按顺序。
答案 2 :(得分: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))