用于嵌套字典键值的itemgetter
我想用 itemgetter
来获取一个嵌套字典中的值:
from operator import itemgetter
dct = {"name": {"en": "John"}}
getter = itemgetter("name", "en")
getter(dct)
这段代码给我报错:
Traceback (most recent call last):
File "/Users/alber.aleksandrov/PycharmProjects/Playground/sa/разное.py", line 5, in <module>
getter(dct)
KeyError: 'en'
我应该怎么用 itemgetter
才能让它正常工作呢?
4 个回答
1
正如其他人提到的,这并不是operator.itemgetter
应该工作的方式。如果你想的话,可以自己写一个自定义的。
def nested_item_getter(*items):
if not items:
raise ValueError("You need to pass at least one key")
def inner(d: dict):
for item in items:
res = d[item]
d = res
return res
return inner
dct = {"name": {"en": "John"}}
getter = nested_item_getter("name", "en")
print(getter(dct))
输出结果:
John
3
问题在于,itemgetter("name", "en")
试图返回一个包含 (dct["name"], dct["en"])
的元组,而不是 dct["name"]["en"]
。
解决办法是自己写一个嵌套的获取器。我在 haggis.recipes.chained_getter
中写了一个。你可以这样使用它:
getter = chained_getter("[][]", "name", "en")
这些参数都是位置参数,这样可以处理索引可以是任何对象的情况。你不局限于使用字符串作为键。
5
你可以使用functools库里的reduce函数。
from functools import reduce, partial
dct = {"name": {"en": "John"}}
keys = ["name", "en"]
reduce(dict.get, keys, dct)
输出结果:
Jonh
作为一个部分函数。
def get_itemgetter(keys):
def partial_func(dtc):
return reduce(dict.get, keys, dtc)
return partial_func
itemgetter = get_itemgetter(keys)
itemgetter(dct)