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

我想在列表中找到具有相同属性的任何元素对.例如,

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提取这些键的所有组合.

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...