繁体   English   中英

在元组列表中找到重叠的元素?

[英]Find overlapping elements in a list of tuples?

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

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返回这2个元组:(4,5,5)和(4,5,6),是否有比嵌套嵌套循环更简单的方法(如下)?

for single_tuple_1 in tup_1:
    for single_tuple_2 in tup_2:
        if single_tuple_1[0] == single_tuple_2[0] and single_tuple_1[1] == single_tuple_2[1]:
            print single_tuple_1,single_tuple_2

编辑:

对于这种情况,假设顺序很重要,并且元组包含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)]

而且我想找到在各自的前四个元素中相交的元组。 因此结果应为:

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

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

如果要返回所有“重叠”元组对,则无法比较所有对,即二次算法。 但是,您可以使用列表推导,组合的productzipsum进行比较,使代码更加优雅:

>>> 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))]

注意:这将检查两个元组是否至少在两个位置具有相同的元素,即顺序很重要。 如果顺序无关紧要,则可以将ab转换为set然后检查其交点的大小,但是对于重复的数字(即(1,1,2)(1,1,3)的交点(1,1,2)可能会失败只会是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的一个元素,但是可以很容易地识别出来。

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)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM