获取嵌套字典中唯一值的列表(或集)

las*_*lex 4 python dictionary list set

我想知道是否有更优雅/ pythonic方式来做以下事情.假设我有一个嵌套字典:

orders = {'peter': {'food': 'pizza', 'drink': 'soda'}, 'paul': {'food': 'taco', 'drink': 'soda'},'mary': {'food': 'pizza', 'drink': 'water'}}
Run Code Online (Sandbox Code Playgroud)

我想获得一份包含每个人独特的"食物"项目的清单,即 ['pizza', 'taco']

这是最简单的方法吗?

foodList = []
for i in orders.keys():
    foodList.append(orders[i]['food'])
s = set(foodList)
Run Code Online (Sandbox Code Playgroud)

Bha*_*Rao 8

使用集合理解.

>>> {orders[i]['food'] for i in orders}
{'pizza', 'taco'}
Run Code Online (Sandbox Code Playgroud)

如果值food是列表或元组,则可以在集合理解中使用嵌套循环.

>>> orders = {'peter': {'food': ['pizza','fries'], 'drink': 'soda'}, 'paul': {'food': ['taco'], 'drink': 'soda'}}
>>> {j for i in orders for j in orders[i]['food']}
{'pizza', 'taco', 'fries'}
Run Code Online (Sandbox Code Playgroud)

您甚至可以operator.itemgetterPadraic一样使用.

>>> from operator import itemgetter 
>>> set(map(itemgetter("food"), orders.values()))
{'pizza', 'taco'}
Run Code Online (Sandbox Code Playgroud)

同样,如果食物的值是一个列表,您可以使用chain.

>>> from itertools import chain
>>> set(chain(*map(itemgetter("food"), orders.values())))
{'pizza', 'taco', 'fries'}
Run Code Online (Sandbox Code Playgroud)