4

我有列表列表,二级列表的每个第一项都可以看作是一种关于其性质的元信息。

# simple sample, real data are much more complex, but it can be schematized as this one
L = [('n0', 1), ('n1', 4), ('n1', 2), ('n2', 5)] 

性质可在此处获得:

natures = list(set(zip(*L)))[0]

我需要建立另一个列表,其中每个不同的可能组合按每个“自然”的连续分组,(即natures

结果应该来自下面的示例

R = [
     [('n0', 1), ('n1', 4), ('n2', 5)],
     [('n0', 1), ('n1', 2), ('n2', 5)]
]

我认为这可以使用一些 itertools 包巧妙地完成,但我完全迷失在其中,有人可以帮助我使用正确的 itertools 东西(groupby也许product?)

最好的祝福

4

2 回答 2

4

首先,您可以使用itertools.groupby按性质对元素进行分组,然后您可以使用该itertools.product功能形成来自不同性质的项目的所有组合。

L = [('n0', 1), ('n1', 4), ('n1', 2), ('n2', 5)] 

from itertools import groupby, product
groups = [list(group) for key, group in groupby(L, lambda x: x[0])]
R = map(list, product(*groups))
print R

输出:

[[('n0', 1), ('n1', 4), ('n2', 5)], [('n0', 1), ('n1', 2), ('n2', 5)]]
于 2013-09-04T11:05:56.887 回答
1

如果您首先将您的natures转换为元组/列表列表,则可以按照此答案中的说明进行操作:

>>> from itertools import product
>>> natures = [[1], [2, 4], [5]]
>>> list(product(*natures))
[(1, 2, 5), (1, 4, 5)]
于 2013-09-04T10:59:01.937 回答