Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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 - Fatal编程技术网

重复属性上的Python匹配

重复属性上的Python匹配,python,Python,我有一个对象列表,每个对象都有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=

我有一个对象列表,每个对象都有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)
然后搜索长度超过2的列表的adict.values()。然后(以某种方式)合并列表。

我希望有一个优雅的解决方案?

整个问题都是用集合来描述的,所以让我们用集合来思考它。首先用英文输入伪代码:

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(匹配等价集合中元素的(值,元素)
。“查找所有的等价集…”是一种理解:
{equivalenceset for equivalenceset for equivalenceset in equivalenceset if…}

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


这就足够你自己写了。

整个问题都是用集合来描述的,所以让我们用集合来思考它。首先用英文输入伪代码:

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(匹配等价集合中元素的(值,元素)
。“查找所有的等价集…”是一种理解:
{equivalenceset for equivalenceset for equivalenceset in equivalenceset if…}

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


这就足够自己编写了。

所以如果obj2匹配obj1,obj3匹配obj2,那么obj3匹配obj1,即使它们不共享任何属性,您也希望“匹配”是可传递的。听起来您希望如何处理
obj4
obj5
匹配值
a
,而且,作为旁注:如果需要集合,请使用
set
s,而不是
list
s。您的输出应该是
[{obj1,obj2,obj3,obj5},{obj4,obj6},{obj7}]
。这更显式,几乎可以肯定更高效,甚至可以使您的代码更易于编写。@abarnert-yes。我很难捕捉及物性。如果obj2匹配obj1,obj3匹配obj1,那么它们都匹配。因此,如果obj2匹配obj1,obj3匹配obj2,那么obj3匹配obj1,即使它们不共享任何属性,您也希望“匹配”是可传递的。听起来您希望如何处理
obj4
obj5
匹配值
a
,而且,作为旁注:如果需要集合,请使用
set
s,而不是
list
s。您的输出应该是
[{obj1,obj2,obj3,obj5},{obj4,obj6},{obj7}]
。这更显式,几乎可以肯定更高效,甚至可以使您的代码更易于编写。@abarnert-yes。我很难捕捉及物性。如果obj2匹配obj1,obj3匹配obj1,那么它们都匹配。对不起,我在for循环中循环了什么?所有对象的输入列表?@user1639926:外部循环在所有对象的输入列表上循环。每一个将被一个接一个地放入一个等价集(可能会合并多个等价集);一旦你完成了它们,一切都完成了。理解中的内部循环分别在单个结果等价集和等价集的完整结果集上循环。@user1639926:如果您间接指出这将是最坏情况O(N^2)…那么是的,这是真的,但是,由于您确实需要将每个对象与另一个对象进行比较,以确定其是否匹配(除非您已经发现它们是通过传递方式匹配的,这一点由该算法负责),因此我看不到任何解决方法。我还没有考虑O()时间。只是试着去理解它。我的N很小,10-20英寸。@user1639926:没问题。如果有任何部分你被卡住了(或者我弄错了…毕竟,伪代码显然没有被调试),在这里添加另一个注释,或者如果它值得另一个问题,创建一个新问题。对不起,我在for循环中循环了什么?所有对象的输入列表?(这似乎不对?@user1639926:外部循环在