在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个元素