【问题标题】:From a dictionary made of multiple lists choose one element from each从由多个列表组成的字典中,从每个列表中选择一个元素
【发布时间】:2021-04-03 06:31:30
【问题描述】:

假设我有一个这样的列表字典:

lists= {'pet': ["dog", "cat", "parrot"],
        'amount': [1,2,3],
        'food': ["canned", "dry"]}

我想从每个列表中随机选择一个元素,所以结果是这样的:

{'amount': 2, 'food': 'canned', 'pet': 'cat'}

使用 Python 实现它的最简单方法是什么?

【问题讨论】:

  • 使用随机模块,遍历字典,并从每个值中选择一个随机元素?

标签: python python-3.x list dictionary random


【解决方案1】:

你试过random.choice吗?

from random import choice

{k: choice(v) for k in lists.items()}  # use lists.iteritems() in python 2.x 
# {'pet': 'parrot', 'amount': 3, 'food': 'canned'}

或者,如果您想就地更新lists,请使用

for k, v in lists.items():
    lists[k] = choice(v)

lists
# {'pet': 'parrot', 'amount': 3, 'food': 'canned'}

或者,如果您的 python 版本支持有序的内置字典(>= cpython3.6,>= python3.7),您可以尝试使用map 作为替代功能:

dict(zip(lists, map(choice, lists.values())))
# {'pet': 'parrot', 'amount': 2, 'food': 'dry'}

我个人喜欢前两个选项。

【讨论】:

  • ~~对于第一个示例,{k: choice(v) for k, v in lists.items()} 可能会更简洁一些。~~ 快速编辑!不错。
  • 第一个解决方案是完美的,因为我希望能够生成多个结果,而不是修改列表。
  • @acushner 是的,很好,谢谢。我认为我之前的解决方案只有在列表很大并且我们不想使用 .items() 生成额外视图时才会更可取,但这更干净,是的。
  • 额外视图有多大?我一直认为它只是一个迭代器......
  • 其实,我会做一些研究,看看有没有什么有趣的。
猜你喜欢
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
相关资源
最近更新 更多