Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何最好地遍历字典中的列表?_Python_Python 3.x - Fatal编程技术网

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)