我有一个复杂的嵌套字典结构,需要根据嵌套字典中的值删除元素。我的字典如下所示:
my_dict = {
'item1': {'name': 'Apple', 'price': 1.0, 'category': {'id': 1, 'name': 'Fruit'}},
'item2': {'name': 'Banana', 'price': 0.5, 'category': {'id': 1, 'name': 'Fruit'}},
'item3': {'name': 'Carrot', 'price': 0.75, 'category': {'id': 2, 'name': 'Vegetable'}},
'item4': {'name': 'Broccoli', 'price': 1.5, 'category': {'id': 2, 'name': 'Vegetable'}}
}
我想过滤这个词典,使其仅包含属于“水果”类别的项目。我尝试了以下代码:
new_dict = {}
for key, value in my_dict.items():
if value['category']['name'] == 'Fruit':
new_dict[key] = value
print(new_dict)
这是可行的,但我想知道是否有更简洁或更 Pythonic 的方法来实现这一点,也许使用字典理解或类似的过滤函数filter()
。
作为字典理解
字典推导式 可用于根据任意键和值表达式创建字典。
使用
filter()
该
filter()
函数用于:返回
dict.items()
一个可迭代对象,其中每个元素都是一个长度为 2 的元组item
。我们可以将每个元素传入一个lambda 函数,其中item[0]
是键, 是item[1]
值。filter()
返回一个符合条件的元组的迭代器。我们可以将其包装进去得到一个字典(与返回 的dict()
方法相同)。dict([("key1", "value1"), ("key2", "value2")])
{'key1': 'value1', 'key2': 'value2'}
最 Pythonic 的方式
实现“Pythonicness”(Pythonicity?)这个模糊的目标总是有些主观。我认为字典推导式简洁明了,但很难看清它在做什么,尤其是在
dict
嵌套很深或条件很复杂的情况下。最好把它包装在一个命名合适的函数中,这样就能看清到底发生了什么。为了清晰起见,我添加了类型注解:这与第一种方法基本相同,但更容易看清。
您可以使用字典推导式,它会更简洁,但可以说更难阅读:
以“pythonic”方式执行此操作:
你也可以这样做
filter