在Python中查找具有相同属性的列表中的两个元素
发布时间:2020-12-20 11:06:24 所属栏目:Python 来源:网络整理
导读:我想在列表中找到具有相同属性的任何元素对.例如, 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
我想在列表中找到具有相同属性的任何元素对.例如,
class X: def __init__(self,param): self.param = param my_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 defaultdict class 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提取这些键的所有组合. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |