Python和列表元素的所有组合按特定顺序

时间:2017-02-18 02:07:27

标签: python list combinations

我有一个如下列表:

((0,n1,n2,...,nX),(0,n1,n2,...,nY),(1,n1,n2,...,nZ),(2,n1,n2,...,nR),(2,n1,n2,...,nS))

我想以这种方式返回列表元素的所有可能组合:

(0,n1,n2,...,nX),(1,n1,n2,...,nZ),(2,n1,n2,...,nR)
(0,n1,n2,...,nY),(1,n1,n2,...,nZ),(2,n1,n2,...,nR)
(0,n1,n2,...,nX),(1,n1,n2,...,nZ),(2,n1,n2,...,nS)
(0,n1,n2,...,nY),(1,n1,n2,...,nZ),(2,n1,n2,...,nS)

所以,我已经理解并确定我需要迭代元素并检查列表元素的第一项以按第一项分组元素。

它可以让我做一个for循环?并尝试手动创建所有组合?

但是我想知道是否有更好的方法?

我需要记住,元素必须按元素的第一项升序 - > 0,1,2

编辑:

换句话说,这是我的清单:

((0,A), (0,B), (1,C), (2,D),(2,E))

如何返回如下:

(0,A),(1,C),(2,D)
(0,B),(1,C),(2,D)
(0,A),(1,C),(2,E)
(0,B),(1,C),(2,E)

1 个答案:

答案 0 :(得分:1)

如果稍微更改数据结构,问题会变得更容易。更具体地说,只需在同一列表中对具有相同“ID”的所有元素进行分组。

对于您的示例,您有3个列表:

a = [(0,n1,n2,...,nX),(0,n1,n2,...,nY)]
b = [(1,n1,n2,...,nZ)]
c = [(2,n1,n2,...,nR),(2,n1,n2,...,nS)]

如果您将列表分开,请告诉我,我会修改我的答案。

然后你可以使用itertools.product函数来获得你想要的所有组合。

import itertools
for i in itertools.product(a, b, c):
    print i

或者,如果您希望将所有组合视为列表,您可以执行以下操作:

list(itertools.product(a, b, c)) 

同样,如果您想将所有组合视为元组或集合,则可以使用tuple()set()

编辑: 如果你没有将你的元素组合在一起,而是你有一个扁平的元组列表(或元组),你可以创建一个列表,根据它们的“ID”(即简单元组的第一个值)对元组进行分组。这是一个功能。我假设最初给出元组的顺序没有顺序(否则我们可能会使这个分组更有效)

def groupList(flatlist):
    tempdict = {}
    for element in flatlist:
        id = element[0]
        if id in tempdict:
            tempdict[id].append(element)
        else:
            tempdict[id] = [element]
    return list(tempdict.values())

现在您可以使用此“分组”列表来获取所有组合。假设您的初始列表是l,那么您可以这样做:

list(itertools.product(*groupList(l)))

通过参数时请注意*。这告诉python使用此列表的元素作为函数的单独参数。

示例输入:

  

l =((0,10),(0,20),(1,30),(2,40),(2,50))

示例输出:

  

[((0,10),(1,30),(2,40)),((0,10),(1,30),(2,50)),((0,20) ,   (1,30),(2,40)),((0,20),(1,30),(2,50))]