【问题标题】:create a list of dictionaries with randomised elements from two lists - python使用来自两个列表的随机元素创建字典列表 - python
【发布时间】:2013-08-09 17:13:12
【问题描述】:

在 python 中有没有办法在一个列表中的两个列表之间执行随机化并返回一个字典?

例如,来自:

[[1,2,3,4], ['a','b','c','d']]

到:

[{3:'a'}, {1:'d'}, {2:'c'}, {4:'b'}]

实现这一目标的最佳方法是什么?使用列表理解?我的两个列表实际上非常大,所以我想知道是否有更有效的替代方案。

【问题讨论】:

  • 您真的想要一个单例字典列表,正如您的代码所建议的那样,还是您想要一个单一的字典,正如您的文本所暗示的那样?以前的数据结构对我来说似乎毫无意义。
  • 您真的想要一个单项字典列表(这是您要求的输出),还是像{1: 'd', 2: 'a', 3: 'c', 4: 'b'} 这样的单个字典?
  • 我希望列表显示在输出中,因为这是外部程序期望列表的结构。

标签: python list random dictionary


【解决方案1】:
import random
keys, values = [[1,2,3,4], ['a','b','c','d']]
random.shuffle(values)
result =  [{k:v} for k, v in zip(keys, values)]

产生一个列表,例如:

In [7]: result
Out[7]: [{1: 'd'}, {2: 'b'}, {3: 'c'}, {4: 'a'}]

更节省内存的替代方法是使用迭代器:

import itertools as IT
result = ({k:v} for k, v in IT.izip(keys, values))

更大的问题是为什么您需要一系列小字典。拥有一个 dict 会不会更有用,例如 Steven Rumbalski 的回答所产生的那个?

或者,如果你真的只是想要一个随机配对,也许一个元组的迭代器就足够了:

result = IT.izip(keys, values)

【讨论】:

  • 但是我怎样才能访问列表中的字典呢?
  • 您可以使用for dct in result 循环浏览这些项目。
【解决方案2】:

这会根据您的问题请求创建一个字典,而不是单个字典列表。如果你真的想要,请使用unutbu's answer

import random

a = [1,2,3,4]
b = ['a','b','c','d']

random.shuffle(a)
result = dict(zip(a, b))

如果您无法更改源列表:

dx = range(len(a))
random.shuffle(dx)
dict(zip((a[i] for i in dx), b))

【讨论】:

  • 这将产生一个字典,而不是一个字典列表。 (OP想要的结构有点奇怪,所以我也被愚弄了。)
  • @DSM:我错过了。我会保持原样,因为 unutbu 在他的回答中提到了它。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2015-01-17
  • 2016-07-09
  • 2020-05-19
  • 2016-07-10
  • 1970-01-01
相关资源
最近更新 更多