设置字典的getter用于字典

时间:2017-05-01 09:12:31

标签: python dictionary filter

根据documentation

,这是有效的
>>> 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;对于词典?

2 个答案:

答案 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对象。