Python交叉匹配

Python交叉匹配,python,python-2.7,Python,Python 2.7,在执行了一些算法之后,我得到了一个类似于下面的列表: l = Set([(integer_4_digits, integer_n_digits], ..) ex: l = Set([(1011, 123556), (1041, 424553), (1241, 464096), (1027, 589325), (1011, 432341), (1031, 423076)]) l = list(l) #all tuples must exist once. need to get items by

在执行了一些算法之后,我得到了一个类似于下面的列表:

l = Set([(integer_4_digits, integer_n_digits], ..)
ex: l = Set([(1011, 123556), (1041, 424553), (1241, 464096), (1027, 589325), (1011, 432341), (1031, 423076)])
l = list(l) #all tuples must exist once. need to get items by index to match (perhaps?)
此列表中的每个元组的第一项为4位正整数,第二项为另一个正整数

我想要的是:

要创建一个新的列表或元组列表,其中所有可能的组合都分组在一个列表或具有交叉匹配(包括第五个或第三个)的元组中,如果是tuple+tuple+bool元素,则根据两个新匹配的交叉元组的前4位整数是否相同,判断为真或假,例如:1011==1011,所以bool=True

所以在这个过程之后,我想得到如下结果:

new_list = [(l[0], l[1], False), (l[0], l[2], False), (l[0], l[3], False), (l[0], l[4], True) ..
            (l[1], l[2], False), (l[1], l[3], False), (l[1], l[4], False), ..
            (l[2], l[3], False), (l[2], l[4], False), (l[2], l[5], False), ..]
如您所见,新的_列表不包含重复的匹配项。l[0]只与l[1]匹配一次,无论匹配元组是a to be还是b to a l[0],l[1],。。或l[1],l[0]

现在我可以使用嵌套的for e in l循环,弹出最后一个e元素,对bool执行e[0]检查,创建一个新的元组或列表,并添加到新的_列表中来实现这一点

那我该怎么做呢?我应该怎么做?

使用;它会创建您正在寻找的组合。与列表理解一起,您应该设置:

from itertools import combinations

[(i, j, i[0] == j[0]) for i, j in combinations(l, 2)]
注意,Set类型是python中内置的本机类型;对于本机版本,只需使用set lowercase。我们不需要将集合变成一个列表,这样就可以工作了;itertools对这两种方式都不在乎。您甚至可以使用新的{elem,elem,elem}集文字语法

这将产生:

>>> from itertools import combinations
>>> l = {(1011, 123556), (1041, 424553), (1241, 464096), (1027, 589325), (1011, 432341), (1031, 423076)}
>>> [(i, j, i[0] == j[0]) for i, j in combinations(l, 2)]
[((1041, 424553), (1027, 589325), False), ((1041, 424553), (1011, 123556), False), ((1041, 424553), (1031, 423076), False), ((1041, 424553), (1241, 464096), False), ((1041, 424553), (1011, 432341), False), ((1027, 589325), (1011, 123556), False), ((1027, 589325), (1031, 423076), False), ((1027, 589325), (1241, 464096), False), ((1027, 589325), (1011, 432341), False), ((1011, 123556), (1031, 423076), False), ((1011, 123556), (1241, 464096), False), ((1011, 123556), (1011, 432341), True), ((1031, 423076), (1241, 464096), False), ((1031, 423076), (1011, 432341), False), ((1241, 464096), (1011, 432341), False)]
使用;它会创建您正在寻找的组合。与列表理解一起,您应该设置:

from itertools import combinations

[(i, j, i[0] == j[0]) for i, j in combinations(l, 2)]
注意,Set类型是python中内置的本机类型;对于本机版本,只需使用set lowercase。我们不需要将集合变成一个列表,这样就可以工作了;itertools对这两种方式都不在乎。您甚至可以使用新的{elem,elem,elem}集文字语法

这将产生:

>>> from itertools import combinations
>>> l = {(1011, 123556), (1041, 424553), (1241, 464096), (1027, 589325), (1011, 432341), (1031, 423076)}
>>> [(i, j, i[0] == j[0]) for i, j in combinations(l, 2)]
[((1041, 424553), (1027, 589325), False), ((1041, 424553), (1011, 123556), False), ((1041, 424553), (1031, 423076), False), ((1041, 424553), (1241, 464096), False), ((1041, 424553), (1011, 432341), False), ((1027, 589325), (1011, 123556), False), ((1027, 589325), (1031, 423076), False), ((1027, 589325), (1241, 464096), False), ((1027, 589325), (1011, 432341), False), ((1011, 123556), (1031, 423076), False), ((1011, 123556), (1241, 464096), False), ((1011, 123556), (1011, 432341), True), ((1031, 423076), (1241, 464096), False), ((1031, 423076), (1011, 432341), False), ((1241, 464096), (1011, 432341), False)]

你好,Martijn,非常感谢!这太棒了,太优雅了。很好的解决方案。干杯顺便说一句,如果你有时间,只是出于好奇,我有一个小问题。如果你想让这个列表大2倍,相同的元素在不同的位置j,i,Bool,你怎么把它加倍?在2个变量和concat上运行函数两次?还有其他优雅的方式吗?@Phil:result=result*2也会让列表翻一番。仔细考虑;如果您的列表包含可变项,例如其他列表、集合、dict或自定义类实例,则在该加倍列表中会出现加倍引用,而不是值。对于元组、字符串和整数,这很好。你好,Martijn,非常感谢!这太棒了,太优雅了。很好的解决方案。干杯顺便说一句,如果你有时间,只是出于好奇,我有一个小问题。如果你想让这个列表大2倍,相同的元素在不同的位置j,i,Bool,你怎么把它加倍?在2个变量和concat上运行函数两次?还有其他优雅的方式吗?@Phil:result=result*2也会让列表翻一番。仔细考虑;如果您的列表包含可变项,例如其他列表、集合、dict或自定义类实例,则在该加倍列表中会出现加倍引用,而不是值。对于元组、字符串和整数,这很好。