【问题标题】:Create a dynamic nested dictionary in python using for loop使用for循环在python中创建动态嵌套字典
【发布时间】:2017-01-03 14:11:15
【问题描述】:

我是 Python 的新手,并试图“在工作中”学习它。我必须这样做。

是否可以动态创建一个“dictionary1”,它以另一个“dictionary2”为值,其中“dictionary2”也在每个 for 循环中更新。基本上就代码而言,我尝试过:

fetch_value = range(5) #random list of values (not in sequence)

result = {} #dictionary2
ret = {} #dictionary1

list1 = [0, 1] #this list is actually variable length, ranging from 1 to 10 (assumed len(list1) = 2 for example purpose only)

for idx in list1:
    result[str(idx)] = float(fetch_value[1])
    ret['key1'] = (result if len(list1) > 1 else float(fetch_value[1])) # key names like 'key1' are just for representations, actual names vary
    result[str(idx)] = float(fetch_value[2])
    ret['key2'] = (result if len(list1) > 1 else float(fetch_value[2]))
    result[str(idx)] = float(fetch_value[3])
    ret['key3'] = (result if len(list1) > 1 else float(fetch_value[3]))
    result[str(idx)] = float(fetch_value[4])
    ret['key4'] = (result if len(list1) > 1 else float(fetch_value[4]))

print ret

这输出到:

{'key1': {'0': 4, '1', 4}, 'key2': {'0': 4, '1', 4}, 'key3': {'0': 4, '1', 4}, 'key4': {'0': 4, '1', 4}}

我需要什么:

{'key1': {'0': 1, '1', 1}, 'key2': {'0': 2, '1', 2}, 'key3': {'0': 3, '1', 3}, 'key4': {'0': 4, '1', 4}}

有什么明显的我做错了吗?

【问题讨论】:

  • 您需要通过result.copy()使用内部字典的副本
  • 您可能希望使用字典理解来根据需要创建新的内部字典,而不是重复复制一个字典,例如{key: {idx: fetch_value(idx) for idx in [0, 1]} for key in range(1, 5)}.
  • @MosesKoledoye 谢谢!这很有用,但现在通过将上面代码中的 result 替换为 result.copy(),输出为 {'key1': {'0': 4, '1', 1}, 'key2': {'0': 4, '1', 2}, 'key3': {'0': 4, '1', 3}, 'key4': {'0': 4, '1', 4}}
  • 所以你正在做一些奇怪的事情。您的 (result if len(list1) > 1 else float(fetch_value[1])) 将始终评估为 true 对吗? len(list1) 不会改变
  • 也许你想用 for i,idx in enumerate(list1)

标签: python for-loop dictionary nested dictionary-comprehension


【解决方案1】:

有两个问题:

  1. 当您在ret 中设置一个键时,您需要创建结果字典的副本。否则,它将始终保留对同一字典的引用。
  2. 进行该更改后,您将在第二个循环开始时保留最后一个 ret 字典(包含 {'0': 4}),并且该字典将被复制到所有键。

更简洁的方法是字典理解:

fetch_value = range(5)
list1 = [0, 1]
print {
    'key{}'.format(i): {
        str(list_item): float(fetch_value[i]) for list_item in list1
    } if len(list1) > 1 else float(fetch_value[i])
    for i in xrange(1, 5)
}

输出:

{
    'key3': {'1': 3.0, '0': 3.0},
    'key2': {'1': 2.0, '0': 2.0},
    'key1': {'1': 1.0, '0': 1.0},
    'key4': {'1': 4.0, '0': 4.0}
}

对于list1 = [0],您似乎想要一个浮点值而不是字典,输出将是:

{'key3': 3.0, 'key2': 2.0, 'key1': 1.0, 'key4': 4.0}

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 2021-07-25
    • 2019-03-29
    • 2020-06-14
    • 2019-09-30
    • 2020-11-02
    • 2022-01-03
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多