【问题标题】:Populate Python dictionaries with pre-assigned keys and values of a particular length使用预先分配的特定长度的键和值填充 Python 字典
【发布时间】:2021-11-25 01:42:48
【问题描述】:

例如,我在 Python 中有以下字典:

memory_map = {'data': [1,2,3], 'theta': [4,5,6,7]}

我想创建另一个与memory_map 相同的随机字典,具有相同的键和相同长度的列表作为它们的值,但是列表的元素使用np.random.default_rng(seed).uniform(low, high, size) 函数填充随机值。

例如:random_dict = {'data': [5,3,1], 'theta': [7,3,4,8]}

此外,如果键的名称或值中列表的长度发生变化,这应该会自动反映在创建的 random_dict 中。

如果我从memory_map 添加新密钥或删除密钥,这也应该反映在random_dict 中。

到目前为止,我有random_dict = {item: [] for item in list(memory_map.keys())},但不确定如何用相同长度的随机值填充空列表。

谢谢。

【问题讨论】:

  • import random; random_dict = {k: [random.randint(1, 9) for _ in v] for k, v in memory_map.items()}
  • 那么如果你给内存映射添加一个新的key,它应该给random_dict添加一个新的key?
  • 您能发布到目前为止您尝试过的内容吗?看起来是一个相当简单的问题,可以用循环来解决。
  • 请使用tour、阅读what's on-topic hereHow to Askquestion checklist,并提供minimal reproducible example。 “为我实现此功能”与此站点无关,因为 SO 不是免费的在线编码服务。你必须诚实地尝试,然后就你的算法或技术提出一个具体问题
  • 我在问题中添加了更多信息,以及到目前为止我尝试过的内容。谢谢。

标签: python list dictionary dictionary-comprehension


【解决方案1】:

看起来你想要这样的东西。

import random
import itertools


def shuffle_map(input_map):
    # Grab a list of all values
    all_values = list(itertools.chain(*input_map.values()))
    random.shuffle(all_values)  # Shuffle it

    new_map = {}  # Initialize a new map
    i = 0  # Keep track of how many items we've consumed
    for key, value in input_map.items():
        n = len(value)  # How many values per this key
        new_map[key] = all_values[i : i + n]  # Assign a slice
        i += n

    return new_map


memory_map = {"data": [1, 2, 3], "theta": [4, 5, 6, 7]}
print(shuffle_map(memory_map))

这会打印出来(例如,连续运行)

{'data': [1, 5, 7], 'theta': [2, 4, 3, 6]}
{'data': [6, 7, 1], 'theta': [5, 4, 3, 2]}
{'data': [5, 2, 3], 'theta': [7, 6, 4, 1]}

【讨论】:

  • 感谢您的建议。如果我想使用np.random.default_rng(seed).uniform(low, high, size) 填充列表怎么办?
【解决方案2】:

对于随机列表,您应该查看标准库中的random 模块,特别是random.samplerandom.choices,具体取决于您的需要。 对于第二个请求,即根据第一个请求的更改自动更新字典,最简单的方法是围绕从 collections.UserDict 类继承的第一个 dict 创建一个包装器

【讨论】:

  • 你不需要继承 UserDict 来继承一个字典。
  • 是的,可能从 dict 继承它只是更容易
猜你喜欢
  • 2018-03-28
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 2020-08-20
  • 2019-03-20
  • 1970-01-01
相关资源
最近更新 更多