使用for循环在python中创建动态嵌套字典

时间:2016-08-26 20:25:25

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

我是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}}

任何明显我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

有两个问题:

  1. 当您在ret中设置密钥时,需要创建结果字典的副本。否则,它将始终保持对同一字典的引用。
  2. 通过该更改,您将在第二个循环的开头保留最后一个ret字典(包含{'0': 4}),并将其复制到所有密钥。
  3. 更简洁的方法是字典理解:

    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}