我有一个dicts列表如下:
lst = [{'unitname':'unit1', 'test1': 2, 'test2': 9}, {'unitname':'unit2', 'test1': 24, 'test2': 35}]
如何构建单个字典如下:
dictA = { ('unit1','test1'): 2, ('unit1','test2'): 9, ('unit2','test1'):24, ('unit2','test2' : 35 }
`
我拥有所有单位名称和列表中的测试名称:
unitnames = ['unit1','unit2']
testnames = ['test1','test2']
我试过但是错过了一些单位的测试。
dictA = {}
for unit in unitnames:
for dict in lst:
for k,v in dict.items():
dictA[unit,k] = v
通知书?感谢。
答案 0 :(得分:2)
你可以尝试:
dictA = {}
for l in lst:
name = l.pop('unitname')
for test in l:
dictA[name, test] = l[test]
同时发布并采用与Gareth解决方案相同的假设 - 但是这不会给你额外的项目(名称,'unitname')= name
Marcelo Cantos的解决方案非常优雅,但像我们这样的凡人更容易解析:
dict( ((d['unitname'], k), t)
for d in lst
for (k, t) in d.iteritems()
if k != 'unitname'
)
答案 1 :(得分:2)
dict(((d['unitname'], k), t)
for d in lst
for (k, t) in d.iteritems()
if k != 'unitname')
答案 2 :(得分:1)
dictA = {}
for d in lst:
unit = d['unitname']
for test in testnames:
if test in d:
dictA[unit,test] = d[test]
我假设(1)你的列表中的所有dicts都有一个unitname
键,(2)它的值总是你感兴趣的单位之一,(3)有些人认为在列表中可能有您不感兴趣的测试条目,以及(4)您可能感兴趣的某些测试可能不在列表中的某些测试中。这些假设有点武断;如果有任何错误,那么调整它们的代码应该不难。