gpt4 book ai didi

python - 如何在忽略元组的最后一个元素的同时找到一组元组的交集?

转载 作者:行者123 更新时间:2023-12-02 04:19:47 25 4
gpt4 key购买 nike

编辑:已解决

我通过创建字典 ab 解决了这个问题,其中键是元组 (x,y) 而我的值是整数 t。然后我将我的 key 作为集合返回,采用内置的交点,然后获取所有相交的(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), ...}

我想找到 ab 的“交集”,同时忽略元组的 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 函数而不是编写我自己的(非常低效的)函数,但我看不出解决这个问题的方法。

最佳答案

你不能为此使用内置的交集方法。您也不能将函数附加到内置函数:

def magic_intersect(x):
pass

set.mi = magic_intersect

结果

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

您可以将它们全部放入一个字典中,其中包含每个元组的前两个元素的键和设置/列出所有匹配此元组的值以获得结果:

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

但只有当您需要多次查询这些数据并且不需要在其中放入数百万组时,这才是值得的。

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

此方法会丢失来自项目所在的元组集的信息 - 如果您还需要保留该信息,则还必须以某种方式存储该信息。

关于python - 如何在忽略元组的最后一个元素的同时找到一组元组的交集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61257611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com