Python:如何从键,值字典列表中构造元组,值字典?

时间:2011-03-22 09:14:51

标签: python list dictionary tuples

我有一个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

通知书?感谢。

3 个答案:

答案 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)您可能感兴趣的某些测试可能不在列表中的某些测试中。这些假设有点武断;如果有任何错误,那么调整它们的代码应该不难。