Python 如何最好地遍历字典中的列表?
我有一本字典如下:Python 如何最好地遍历字典中的列表?,python,python-3.x,Python,Python 3.x,我有一本字典如下: a = {'name': 'Test', 'lastName': 'Test', 'scores': ['1', '2'], 'subjects': ['te','re'] } 我尝试过嵌套循环,但我不确定这是否是最好的方法 作为输出,我需要每个分数和主题的词典列表: result1={'name':'Test','lastName':'Test','score':'1','subjects':'te'} 结果2={'name':'Test','lastName':'Tes
a = {'name': 'Test', 'lastName': 'Test', 'scores': ['1', '2'], 'subjects': ['te','re'] }
我尝试过嵌套循环,但我不确定这是否是最好的方法
作为输出,我需要每个分数和主题的词典列表:
result1={'name':'Test','lastName':'Test','score':'1','subjects':'te'}
结果2={'name':'Test','lastName':'Test','score':'2','subjects':'re'}
如何最好地遍历列表并创建这样的字典?分数和科目的数量将始终匹配。
任何帮助都将不胜感激。试试以下方法:
# 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'}
这是一个解压字典的函数
我们首先使用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))
输出
您不需要嵌套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'}]
您可以尝试以下方法:
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,我认为这将帮助您完成任务您可以利用
zip
将分数和科目相互附加,然后将其添加到新列表中
d={'name':'Test','lastName':'Test','scores':['1','2'],'subjects':['te','re']}
模板={'name':d['name'],'lastName':d['lastName']}
res=[]
对于受试者,zip中的分数(d[‘受试者’,d[‘分数’]):
更新({'subjects':subject,'scores':scores})
res.append(模板)
打印(res)
您能展示一下您尝试了什么吗?result1
和示例输出中的result2
完全相同。我假设第二个应该有“分数”:“2”,“受试者”:“re”
?
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)