我正在尝试根据元素的属性在列表中选择一个最常见的项目。
a1 = Myclass(name='a')
a2 = Myclass(name='a')
b1 = Myclass(name='b')
l = [a1,a2,b1]
if most_common(l, attr_name='name') in [a1, a2]:
# I want this true
# 'a' is the most occured 'name'
基本上我想修改代码https://stackoverflow.com/a/1520716/433570
key = operator.itemgetter(0)then operator.attrgetter(attr_name)
想知道这是否可能?
答案 0 :(得分:1)
我偶然发现了寻找同样事情的问题。我不喜欢接受的答案,因为它实际上没有回答这个问题。看看Python的attrgetter实现并决定编写一个。
https://docs.python.org/2/library/operator.html#operator.attrgetter
def resolve_itemattr(obj, attr):
for name in attr.split("."):
try:
obj = obj[name]
except TypeError:
obj = getattr(obj, name)
return obj
def itemattrgetter(attr):
"""
Combo itemgetter and attrgetter
"""
def g(obj):
return resolve_itemattr(obj, attr)
return g
它支持嵌套属性。我已经删除了多个attrs的处理,但要把它重新放进去并不难。
这是让你使用itemattrgetter首先尝试获取项目,失败,获取attr。
答案 1 :(得分:0)
您可以预处理列表:
attr_getter = operator.attrgetter('name')
names = map(attr_getter, l)
if most_common(names) in set(map(attr_getter, [a1, a2])):
pass # do smth here