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)
使用集合理解.
>>> {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.itemgetter像Padraic一样使用.
>>> 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)
| 归档时间: |
|
| 查看次数: |
1113 次 |
| 最近记录: |