python - 在Python中查找具有相同属性的列表中的两个元素
问题描述
我想在列表中找到具有相同属性的任何一对元素。例如,
class X:
def __init__(self, param):
self.param = param
my_list = [X(1), X(2), X(3), X(2), X(3), X(3)]
因此,如果比较 on x.param
,我会寻找my_list[1], my_list[3]
ormy_list[2], my_list[4]
或my_list[2], my_list[5]
or my_list[4], my_list[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 []
但这似乎有点不雅,我想知道是否有更好的方法来做到这一点。
解决方案
collections.defaultdict
提供按属性对对象分组的 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>]})
要提取具有相同属性的对象对,只需过滤字典中长度大于 1 的值的项目。然后使用itertools.combinations
提取这些键的所有组合。
推荐阅读
- r - ggplot2 中分组箱线图的默认间距:如何得出正确的 position_dodge 宽度以排列几何图形?
- javascript - 过滤掉某些单词,只匹配确切的单词
- r - 列表中值的插值
- z3 - pyZ3:扩展 smt2 输出中的 let 表达式?
- matlab - 我希望能够在 MATLAB 的 AppDesigner 中绘制一个 3D 圆。我该怎么做?
- python - 如何从未命名为 config.py 的模块中调用模块变量
- r - 使用 str_detect 查找常量字符串和字符串的可选结尾
- c++ - 我们如何为 C++ 无序集定制我们自己的哈希函数以获得特定的顺序?
- node.js - AWS DynamoD Table 的 StreamSpecification 属性有什么用途?
- android - Dagger 在构建期间“无法访问 SomeComponent”