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

Python 列表元素按一定顺序的所有组合,python,list,combinations,Python,List,Combinations,我的名单如下: ((0,n1,n2,...,nX),(0,n1,n2,...,nY),(1,n1,n2,...,nZ),(2,n1,n2,...,nR),(2,n1,n2,...,nS)) (0,A),(1,C),(2,D) (0,B),(1,C),(2,D) (0,A),(1,C),(2,E) (0,B),(1,C),(2,E) 我希望以以下方式返回列表元素的所有可能组合: (0,n1,n2,...,nX),(1,n1,n2,...,nZ),(2,n1,n2,...,nR) (0,n1,n

我的名单如下:

((0,n1,n2,...,nX),(0,n1,n2,...,nY),(1,n1,n2,...,nZ),(2,n1,n2,...,nR),(2,n1,n2,...,nS))
(0,A),(1,C),(2,D)
(0,B),(1,C),(2,D)
(0,A),(1,C),(2,E)
(0,B),(1,C),(2,E)
我希望以以下方式返回列表元素的所有可能组合:

(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,n1,n2,...,nX),(0,n1,n2,...,nY),(1,n1,n2,...,nZ),(2,n1,n2,...,nR),(2,n1,n2,...,nS))
(0,A),(1,C),(2,D)
(0,B),(1,C),(2,D)
(0,A),(1,C),(2,E)
(0,B),(1,C),(2,E)

如果稍微更改一下数据结构,问题就会变得更容易。更具体地说,只需将同一列表中具有相同“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”(即简单元组的第一个值)对元组进行分组。这里有一个函数。我假设元组最初的给出方式没有顺序(否则我们可能会使这种分组更有效)

现在您可以使用这个“分组”列表来获取所有组合。假设初始列表为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))]


不清楚你在问什么。你想要3个元素的组合?元组是不可变的吗?那么
(0,n1,n2,…,nX)
是否一直保持不变?它只是一个元素吗?然后用一种更简单的形式编写它,比如说
a
。有一个列表,其中的元素是列表(我们称之为子列表)。每个子列表的第一个元素是一种ID。一些子列表可能具有相同的ID,其中一些可能是唯一具有特定ID的子列表,例如,您可以有几个ID=2的子列表,例如,只有一个ID=5的子列表。我想以这样的方式返回所有可能的组合,即我从具有相同ID的子列表中选取一个子列表,并将其放入返回的组合中,但下次我跳过该选取的子列表,只从具有相同ID范围的子列表中选取下一个可用的子列表。。。是否更清楚?检查提供的示例…您可以看到返回的组合中有单个元素,且第一项唯一,例如,每个组合中没有两个值为0的项目作为元素的第一项。是的,现在更清楚了。有一个简单的方法可以做到这一点,如果你稍微改变一下你的数据结构,并将所有具有相同“ID”的“子列表”分组到不同的列表中。好的观点,这就是我所想的,但我有两个挑战:如何将它们分组到不同的列表中。。。以及如何创建这些列表的可能组合并保持一个顺序,这样我就不会在列表1的元素之前有列表2中的元素了?嘿,谢谢你的帮助。itertools帮助很大。当你不知道你将得到多少子列表时,如何将列表分成几个列表?编辑我的答案。我希望这完全回答了你的问题。它几乎完成了任务…它返回元素顺序不正确的列表:例如,id 1被索引为0,id 0被索引为1 id 2被索引为2。这是因为字典本质上是未排序的吗?@user7583612是的字典是未排序的,但您可以在创建分组列表时强制排序。不返回
tempdic.values()
您可以随意创建列表。尽管它会翻转示例中的索引(即使dict未排序),但这似乎很奇怪。在我的简单示例中,维持了上述顺序。