gpt4 book ai didi

重复属性的 Python 匹配

转载 作者:行者123 更新时间:2023-11-28 22:51:11 26 4
gpt4 key购买 nike

我有一个对象列表,每个对象都有 3 个属性,我想找出我的任何对象是否有任何重叠属性,并将它们作为具有重叠属性的对象集提取出来。

让我澄清一下:

class Obj():
'''My example objects! they have 3 attributes.'''
def __init__(a, b, c):
self.a = a
self.b = b
self.c = c

>>>> obj1 = Obj(a= 1, b = 2, c = 3)
>>>> obj2 = Obj(a= 1, b = 5, c = 6)
>>>> obj3 = Obj(a= 10, b = 12, c = 3)
>>>> obj4 = Obj(a= 0, b = 0, c = 0)
>>>> obj5 = Obj(a= 100, b = 5, c = 5)
>>>> obj6 = Obj(a = -10, b = 0, c = 56)
>>>> obj7 = Obj(a = None, b = None, c = None)

# obj2 matches obj1 on attribute: "a"
# obj3 matches obj1 on attribute: "c"
# obj5 matches obj2 on attribute: "b"

# obj6 matches obj4 on attribute: "b"

# obj7 matches no one

因此我的输出应该是:

[[obj1, obj2, obj3, obj5], [obj4, obj6], [obj7]] 

有没有办法用 python 做到这一点?另外,我可以搜索此类内容的任何关键字都会有所帮助。我尝试了以下解决方案。看起来……很老套。

编辑:必须更改一些数字以匹配我的示例。对不起打字错误!

编辑:我目前的解决方案尝试:

adict = defaultdict(list)
for obj in list_objects:
adict[obj.a].append(obj)
adict[obj.b].append(obj)
adict[obj.c].append(obj)

然后搜索 adict.values() 以查找长度超过 2 的列表。然后(以某种方式)组合列表。
我希望有一个优雅的解决方案?

最佳答案

整个问题是用集合来描述的,所以让我们从集合的角度来考虑它。先把它写成英文式的伪代码:

Start with an empty set of equivalence sets
For each value:
Find all the equivalence sets that have any value that matches our value
Remove those equivalent sets from the result set
Union those equivalence sets together and add our new value
Add that to the result set

应该可以吧?

在 Python 中,一个空集是 set(),您通过调用 s.remove(v) 从集合中删除一个值,您将一个值添加到一个通过调用 s.add(v) 设置,并通过调用(破坏性地)s1 |= s2 或(非破坏性地)s = set 来合并集合.union(s1, s2, s3, …)。 (您可以将它与 * 语法一起使用:如果您有一组集合或一组列表,set.union(*s) 会为您提供并集他们都是。)

因此,唯一棘手的一点是“找到具有与我们的元素匹配的任何元素的所有等价集”。 “...具有与我们的值相匹配的任何值”是对 any 的调用,其理解为:any(matches(value, element) for element in equivalenceset)。而“找到所有等价集...”是一个理解:{equivalenceset for equivalencesets in equivalencesets if ...}

显然,您还需要编写那个匹配函数,但这很简单:x.a == y.a or x.b == y.b or x.c == y.c

这应该足够你自己写了。

关于重复属性的 Python 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21866962/

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