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

在Python中查找具有相同属性的列表中的两个元素,python,list,oop,dictionary,attributes,Python,List,Oop,Dictionary,Attributes,我想在列表中找到具有相同属性的任意一对元素。比如说, class X: def __init__(self, param): self.param = param my_list = [X(1), X(2), X(3), X(2), X(3), X(3)] 因此,如果在x.param上进行比较,我会查找我的列表[1]、我的列表[3]或我的列表[2]、我的列表[4]或我的列表[5]或我的列表[4]、我的列表[5]。但是,不能保证列表必须包含具有相同属性的任何元素,例如

我想在列表中找到具有相同属性的任意一对元素。比如说,

class X:
    def __init__(self, param):
        self.param = param

my_list = [X(1), X(2), X(3), X(2), X(3), X(3)]
因此,如果在
x.param
上进行比较,我会查找
我的列表[1]、
我的列表[3]
我的列表[2]、
我的列表[4]
我的列表[5]
我的列表[4]、
我的列表[5]
。但是,不能保证列表必须包含具有相同属性的任何元素,例如

my_list = [X(1), X(2), 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 []
但这似乎有点不雅观,我想知道是否有更好的方法来做到这一点。

提供了一种按属性对对象进行分组的O(n)解决方案:

from collections import defaultdict

class X:
    def __init__(self, param):
        self.param = param

my_list = [X(1), X(2), X(3), X(2), X(3), 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>]})
打印(d)
defaultdict(列表,
{1: [],
2: [, ],
3: [, ]})

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

按属性分组。。巧妙的做法听起来像是一项任务,让所有组都有>1个元素