在Python中查找具有相同属性的列表中的两个元素

在Python中查找具有相同属性的列表中的两个元素,第1张

概述我想在列表中找到具有相同属性的任何元素对.例如, class X: def __init__(self, param): self.param = parammy_list = [X(1), X(2), X(3), X(2), X(3), X(3)] 因此,如果在x.param上进行比较,我会寻找my_list [1],my_list [3]或my_list [2],m 我想在列表中找到具有相同属性的任何元素对.例如,

class X:    def __init__(self,param):        self.param = parammy_List = [X(1),X(2),X(3),X(3)]

因此,如果在x.param上进行比较,我会寻找my_List [1],my_List [3]或my_List [2],my_List [4]或my_List [2],my_List [5]或my_List [4],my_List [5].但是,不能保证列表必须具有任何具有相同属性的元素,例如

my_List = [X(1),X(3)]

也可能是此函数的有效参数.

显而易见的方法似乎是:

def find_dupe(my_List,my_lambda):    attrs = dict()    for item in my_List:        if my_lambda(item) in attrs:             return [attrs[my_lambda(item)],item]        attrs[my_lambda(item)] = item    return []

但它似乎有点不优雅,我想知道是否有更好的方法来做到这一点.

解决方法 collections.defaultdict提供了按属性分组对象的O(n)解决方案:

from collections import defaultdictclass X:    def __init__(self,X(3)]d = defaultdict(List)for i in my_List:    d[i.param].append(i)

结果表明一个对象有param == 1,两个对象有param == 2,三个对象有param == 3:

print(d)defaultdict(List,{1: [<__main__.X at 0x855eb70>],2: [<__main__.X at 0x855e588>,<__main__.X at 0x856ae48>],3: [<__main__.X at 0x856af60>,<__main__.X at 0x856ad68>,<__main__.X at 0x856acf8>]})

要提取具有相同属性的对象对,只需要使用长度大于1的值过滤字典中的项目.然后使用itertools.combinations提取这些键的所有组合.

总结

以上是内存溢出为你收集整理的在Python中查找具有相同属性的列表中的两个元素全部内容,希望文章能够帮你解决在Python中查找具有相同属性的列表中的两个元素所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1192115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存