>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
>>> list(map(operator.itemgetter(1), inventory))
[3, 2, 5, 1]
现在我想做一些类似的事情,以获取一系列词汇:
>>> data = [{'xxx': 'x'}, {'xxx': 'y'}]
>>> list(map(operator.attrgetter('xxx'), data))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'xxx'
我在期待:
['x', 'y']
但似乎attrgetter
不适用于字典(仅适用于类?)。如何设置&#34;元素getter&#34;对于词典?
答案 0 :(得分:2)
嗯,您要获得的项是'xxx'
。 (在这两种情况下,您都希望为列表中的每个对象调用对象的__getitem__
方法。)
>>> from operator import itemgetter
>>> data = [{'xxx': 'x'}, {'xxx': 'y'}]
>>> map(itemgetter('xxx'), data)
['x', 'y']
将属性视为您通过点表示法访问的任何内容,即您的案例中的mydict.xxx
。你应该明白为什么会失败。
答案 1 :(得分:1)
正如timgeb's answer中所述,您应该使用密钥调用itemgetter
(因为attrgetter
用于获取可由.
访问的类属性,例如{{ 1}})。
为了达到理想的效果, list comprehension 的使用是一种更简单的方法:
class_obj.<attribute>
此外,请注意>>> data = [{'xxx': 'x'}, {'xxx': 'y'}]
>>> [d['xxx'] for d in data]
['x', 'y']
,因为python 3.x返回生成器对象而不是map
对象。