Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在元组列表中查找重叠元素?_Python_List_For Loop_Tuples_Intersection - Fatal编程技术网

Python 在元组列表中查找重叠元素?

Python 在元组列表中查找重叠元素?,python,list,for-loop,tuples,intersection,Python,List,For Loop,Tuples,Intersection,根据我对交集函数的理解,它发现列表中元素之间完全重叠。例如: tup_1 = [(1,2,3),(4,5,6)] tup_2 = [(4,5,6)] ol_tup = set(tup_1).intersection(tup_2) print ol_tup 将产生: set([(4, 5, 6)]) 但是,假设我的元组列表设置为: tup_1 = [(1,2,3),(4,5,5)] tup_2 = [(4,5,6)] 其中,tup_1中第二个元组和tup_2中第一个元组的两个元素存在重叠。如

根据我对交集函数的理解,它发现列表中元素之间完全重叠。例如:

tup_1 = [(1,2,3),(4,5,6)]
tup_2 = [(4,5,6)]
ol_tup = set(tup_1).intersection(tup_2)
print ol_tup
将产生:

set([(4, 5, 6)])
但是,假设我的元组列表设置为:

tup_1 = [(1,2,3),(4,5,5)]
tup_2 = [(4,5,6)]
其中,tup_1中第二个元组和tup_2中第一个元组的两个元素存在重叠。如果我想让python返回这两个元组:(4,5,5)和(4,5,6),有没有比下面的嵌套for循环更简单的方法

编辑:

对于这种情况,假设顺序很重要,假设元组包含5个元素:

tup_1 = [(1,2,3,4,5),(4,5,6,7,8),(11,12,13,14,15)]
tup_2 = [(1,2,3,4,8),(4,5,1,7,8),(11,12,13,14,-5)]
我想找出在各自的前4个元素中彼此相交的元组。因此,结果应该是:

[(1,2,3,4,5),(1,2,3,4,8),(11,12,13,14,15),(11,12,13,14,-5)]

代码将如何更改以适应这种情况?

这是使用列表理解的一种方法。写入的逻辑检查至少2个元素的重叠

请注意,如果没有重叠,您将只剩下
tup_2
的一个元素,但是可以很容易地识别出来

from itertools import chain

tup_1 = [(1,2,3),(4,5,5)]
tup_2 = [(4,5,6)]

y = sorted(tup_2[0])
res = [i for i in chain(tup_1, tup_2) if
       sum(i==j for i, j in zip(sorted(i), y)) > 1]

print res

[(4, 5, 5), (4, 5, 6)]

如果要返回所有“重叠”元组对,则无法比较所有对,即二次算法。但是,您可以使用列表理解使代码更加优雅,用于组合和比较的
zip
sum

>>> tup_1 = [(1,2,3),(4,5,5),(7,8,9)]

>>> tup_2 = [(4,5,6),(0,5,5),(9,8,7)]

>>> [(a, b) for (a, b) in itertools.product(tup_1, tup_2)
...         if sum(1 for ai, bi in zip(a, b) if ai == bi) >= 2]
[((4, 5, 5), (4, 5, 6)), ((4, 5, 5), (0, 5, 5))]
注意:这检查两个元组是否在至少两个位置具有相同的元素,即顺序问题。如果顺序不重要,您可以将
a
b
转换为
set
,并检查它们的交集的大小,但对于重复的数字,这可能会失败,即
(1,1,2)
(1,1,3)
的交集将只是
1
,而不是
2

如果只想匹配前两个元素,或者前两个元素和后两个元素,则可以在一致的析取中比较元组的切片:

>>> [(a, b) for (a, b) in itertools.product(tup_1, tup_2)
...         if a[:2] == b[:2]]
[((4, 5, 5), (4, 5, 6))]

>>> [(a, b) for (a, b) in itertools.product(tup_1, tup_2)
...         if a[:2] == b[:2] or a[-2:] == b[-2:]]
[((4, 5, 5), (4, 5, 6)), ((4, 5, 5), (0, 5, 5))]

tup_2
是否始终包含一个元组?如果元素与其他两个元素重叠怎么办?你能打印两对吗?在这种情况下,我认为没有比二次方更快的方法了,即比较每一对。此外,元组中元素的位置是否重要?是否总是要检查两个相同的元素?如果不止这些呢?下面的解决方案有帮助吗?如果有,请随意接受(左边绿色勾号),或者要求澄清。请注意,如果元组有重复的元素,则使用
set
可能会失败。如果我只想匹配每个元组的前2个元素或最后2个元素,我是否必须在a/b、ai/bi或这两个变量中都添加索引括号?
>>> [(a, b) for (a, b) in itertools.product(tup_1, tup_2)
...         if a[:2] == b[:2]]
[((4, 5, 5), (4, 5, 6))]

>>> [(a, b) for (a, b) in itertools.product(tup_1, tup_2)
...         if a[:2] == b[:2] or a[-2:] == b[-2:]]
[((4, 5, 5), (4, 5, 6)), ((4, 5, 5), (0, 5, 5))]