用于嵌套字典键值的itemgetter

0 投票
4 回答
78 浏览
提问于 2025-04-13 01:42

我想用 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)

撰写回答