如何最好地遍历字典中的列表?

时间:2019-06-03 11:38:01

标签: python python-3.x

我有如下字典:

a = {'name': 'Test', 'lastName': 'Test', 'scores': ['1', '2'], 'subjects': ['te','re'] }

我已经尝试过嵌套循环,但是我不确定这是否是最好的方法。

作为输出,我需要每个分数和主题的词典列表:

result1 = { 'name':'Test', 'lastName': 'Test', 'score': '1', 'subjects': 'te'}
result2 = { 'name':'Test', 'lastName': 'Test', 'score': '2', 'subjects': 're'}

如何最好地遍历列表并创建此类词典?分数和主题的数量将始终匹配。 任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:1)

这是解压缩字典的功能。

我们首先使用next在字典中找到一些列表值,其长度是预期的输出大小。

请注意,如果字典根本不包含任何列表,这将失败。

def unzip_dict(d):
    # Find one of the list in the dictionary to read its length
    length = len(next(value for value in d.values() if isinstance(value, list)))

    output = []

    # Unzip the dictionary
    for i in range(length):
        output.append({k: v[i] if isinstance(v, list) else v for k, v in d.items()})

    return output


a = {'name': 'Test', 'lastName': 'Test', 'scores': ['1', '2'], 'subjects': ['te', 're']}

print(unzip_dict(a))

输出

[{'lastName': 'Test', 'name': 'Test', 'scores': '1', 'subjects': 'te'},
 {'lastName': 'Test', 'name': 'Test', 'scores': '2', 'subjects': 're'}]

答案 1 :(得分:0)

尝试一下:

# setup data
a = {'name': 'Test', 'lastName': 'Test', 'scores': ['1', '2'], 'subjects': ['te','re'] }

# create list of dictionary
out_list = []
for value in a.get('scores'):
    for item in a.get('subjects'):
        out_list.append({'name': 'Test', 'lastName': 'Test', 'scores':value, 'subjects':item})

输出:

{'name': 'Test', 'lastName': 'Test', 'scores': '1', 'subjects': 'te'}
{'name': 'Test', 'lastName': 'Test', 'scores': '1', 'subjects': 're'}
{'name': 'Test', 'lastName': 'Test', 'scores': '2', 'subjects': 'te'}
{'name': 'Test', 'lastName': 'Test', 'scores': '2', 'subjects': 're'}

答案 2 :(得分:0)

您不需要嵌套的for循环,一个for循环就足够了:

def foo(a):
finarr=[]
for i in range(len(a['scores'])):
    fnarr={}
    fnarr['name']=a['name']
    fnarr['lastName']=a['lastName']
    fnarr['score']=a['scores'][i]
    fnarr['subject']=a['subjects'][i]
    finarr.append(fnarr)
return finarr

输出:

[{'name': 'Test', 'lastName': 'Test', 'score': '1', 'subject': 'te'},
{'name': 'Test', 'lastName': 'Test', 'score': '2', 'subject': 're'}]

答案 3 :(得分:0)

您可以尝试以下操作:       res1 = {}        res2 = {}

for k,v in a.items():
  if(k == "scores"):
    res1[k] = v[0]
    res2[k] = v[1]
  elif(k=="subjects"):
    res1[k] = v[0]
    res2[k] = v[1]
  else:
    res1[k] = v
    res2[k] = v

 print(res1)
 print(res2)

您还可以查看defaultdict,我认为这将对您的任务有所帮助

答案 4 :(得分:0)

您可以利用zip将分数和主题相互附加,然后将其添加到新列表中。

d = {'name': 'Test', 'lastName': 'Test', 'scores': ['1', '2'], 'subjects': ['te','re'] }
template = {'name': d['name'], 'lastName': d['lastName']}

res = []
for subject, score in zip(d['subjects'], d['scores']):
    template.update({'subjects': subject, 'scores': score})
    res.append(template)

print(res)