Python 如何在忽略元组的最后一个元素的同时找到一组元组的交集? 编辑:已解决

Python 如何在忽略元组的最后一个元素的同时找到一组元组的交集? 编辑:已解决,python,python-3.x,Python,Python 3.x,我通过创建字典a和b解决了这个问题,其中键是元组(x,y),我的值是整数t。然后,我以集合的形式返回关键点,获取内置的交点,然后获取所有相交(x,y)点的值 a{(x,y): t, ...} b{(x,y): t, ...} c = set([*a]).intersection(set([*b])) for each in c: val_a = a.get(each) val_b = b.get(each) 原始问题 我有两组元组,每一组 a = {(x,y,t), (x,y,

我通过创建字典
a
b
解决了这个问题,其中键是元组
(x,y)
,我的值是整数
t
。然后,我以集合的形式返回关键点,获取内置的
交点
,然后
获取所有相交
(x,y)
点的值

a{(x,y): t, ...}
b{(x,y): t, ...}
c = set([*a]).intersection(set([*b]))
for each in c:
    val_a = a.get(each)
    val_b = b.get(each)
原始问题 我有两组元组,每一组

a = {(x,y,t), (x,y,t), ...}
b = {(x,y,t), (x,y,t), ...}
我想找到
a
b
的“交集”,同时忽略元组的
t
元素

例如:

a = {(1,2,5), (4,6,7)}
b = {(1,2,7), (5,5,3)}
c = a.magicintersection(b,'ignore-last-element-of-tuple-magic-keyword')
其中,
c
,期望的输出将产生
{(1,2,5)、(1,2,7)}


我想利用内置的
intersection
函数,而不是编写自己的(效率极低)函数,但我找不到解决方法。

你不能使用内置的intersection方法。也不能将函数附加到内置项:

def magic_intersect(x):
    pass

set.mi = magic_intersect
导致

    set.mi = magic_intersect
TypeError: can't set attributes of built-in/extension type 'set'

您可以将它们全部放入一个字典中,其中包含每个元组前两个元素的键以及与之匹配的set/list all tuple的值,以获得结果:

a = {(1,2,5), (4,6,7)}
b = {(1,2,7), (5,5,3)}

from collections import defaultdict

d = defaultdict(set)

for x in (a,b):
    for s in x: 
        d[(s[0],s[1])].add(s)

print(d)
print(d.get( (1,2) )) # get all tuples that start with (1,2,_)
输出:

defaultdict(<class 'set'>, {
    (4, 6): {(4, 6, 7)}, 
    (1, 2): {(1, 2, 5), (1, 2, 7)}, 
    (5, 5): {(5, 5, 3)}})

{(1, 2, 5), (1, 2, 7)}
defaultdict({
(4, 6): {(4, 6, 7)}, 
(1, 2): {(1, 2, 5), (1, 2, 7)}, 
(5, 5): {(5, 5, 3)}})
{(1, 2, 5), (1, 2, 7)}
但是,只有当您需要多次查询这些数据,而不需要在其中放入数以百万计的数据集时,这才是值得的

2元组的实际“查找”和3元组的实际“查找”速度是O(1)-但是您需要空间/时间来构建字典

这种方法可以从项目出现的元组集合中释放信息——如果您也需要保留它,那么您也必须以某种方式存储它。

如果第三个组件发生变化,您的“交集”会有什么结果

无论如何,实现这一点的方法是拥有一个字典,其中键是一个包含感兴趣组件的元组。字典值可以是包含所有匹配的3元组的列表,然后您可以只选择包含多个元素的值

这不是低效的,您只需要遍历每个集合一次-所以它是O(M+N)-并且您有很多列表和数千个元组,它们具有相同的x,y-然后构建字典将把匹配的元组附加到一个列表中,即O(1)


预期输出是多少。请提供。您可以从元组派生一个新类(或创建一个全新的类),该类仅返回基于前两个元素的哈希值,并仅测试它们的相等性。然后必须在集合中存储此类的实例。谢谢。我觉得我可能得用一本我不熟悉的字典。我将研究这种形式的东西。谢谢——我采纳了你的建议,创建了一个字典,其中每个键都是感兴趣的元组(x,y),并将值设置为整数t。
matches = {}
for series_of_tuples in (a, b):
    for tuple in series_of_tuples:
       matches.setdefault(tuple[:2], []).append(tuple)

intersection = [values for values in matches.values() if len(values) > 1]