将字典映射到词典列表上

时间:2019-05-10 10:32:41

标签: python python-3.x dictionary

我有字典项目

import csv

with open('data.csv', 'a') as f:

                fieldnames = ['Phase', 'Date', 'Time','Name']
                thewriter = csv.DictWriter(f, fieldnames = fieldnames)
                thewriter.writeheader()

                thewriter.writerow({'Phase': _phase, 'Date' : 
                 _currentDT.date(), 'Time' : _currentDT.time(),
                                    'Name' : _nameImage })

我想在名为 loaded

的词典列表上映射Items的值
Items = {1: 1, 2: 2, 3: 2, 4: 2, 5: 2, 6: 3, 7: 4, 8: 5}

这样我就得到了这个结果:

loaded = [{6: [4, 1, 3]}, {1: [5]}, {10: [8, 6]}, {6: [7]}, {2: [2]}]

我尝试运行循环并在找到匹配项但无法正常工作时替换这些值

u_loaded = [{6: [2, 1, 2]}, {1: [2]}, {10: [5, 3]}, {6: [4]}, {2: [2]}]

4 个答案:

答案 0 :(得分:2)

u_loaded = [{k:[Items[a] for a in v] for k,v in l.items()} for l in loaded]
print(u_loaded)

输出

[{6: [2, 1, 2]}, {1: [2]}, {10: [5, 3]}, {6: [4]}, {2: [2]}]

答案 1 :(得分:2)

每次仅一步,您可以按以下方式进行操作。

loaded = [{6: [4, 1, 3]}, {1: [5]}, {10: [8, 6]}, {6: [7]}, {2: [2]}]

Items = {1: 1, 2: 2, 3: 2, 4: 2, 5: 2, 6: 3, 7: 4, 8: 5}

u_loaded = [{k: [Items[val] for val in v] for k,v in d.items()} for d in loaded]

有关1个班轮​​的说明,我们可以将其打开:

u_loaded = [] #stores the list of dicts
for d in loaded:
    u_d = {} #create empty result dict
    for k,v in d.items():
        u_d[k] = [Items[val] for val in v] #for every value, take the corresponding mapping result from loaded
    u_loaded.append(u_d) #append the dictionary to the result list

输出:

[{6: [2, 1, 2]}, {1: [2]}, {10: [5, 3]}, {6: [4]}, {2: [2]}]

答案 2 :(得分:1)

您可以使用简单的list理解:

result = [{k: [Items[v] for v in l] for k, l in d.items()} for d in loaded]
print(result)

输出:

[{6: [2, 1, 2]}, {1: [2]}, {10: [5, 3]}, {6: [4]}, {2: [2]}]

这等效于以下for循环:

result = []

for d in loaded:
    new_sub_dict = {}
    for k, l in d.items():
        new_sub_list = []
        for v in l:
            new_sub_list.append(Items[v])
        new_sub_dict[k] = new_sub_list
    result.append(new_sub_dict)

答案 3 :(得分:0)

您可能想要避免循环,以采用Pythonic样式。您想做的事情仅需一行即可实现:

u_loaded = [{k: [Items[i] for i in v] for k, v in d.items()} for d in loaded]

它使用列表推导来遍历loaded中的所有字典。然后,它在字典键k和值v上循环,以重建您要创建的字典。