Python: Как создать кортеж, словарь значений из списка словаря ключей, значений? - PullRequest
1 голос
/ 22 марта 2011

У меня есть следующий список диктов:

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 ]

2 голосов
/ 22 марта 2011

Вы можете попробовать:

dictA = {}
for l in lst:
  name = l.pop('unitname')
  for test in l:
      dictA[name, test] = l[test]

Размещено в то же время и с теми же предположениями, что и решение Гарета, - однако это не даст вам дополнительного элемента (name, 'unitname') = name


Решение Марсело Кантоса весьма элегантно, но простым смертным, таким как мы, было бы легче разобрать, как это:

dict(     ((d['unitname'], k), t)
     for d in lst
       for (k, t) in d.iteritems()
         if k != 'unitname'
    )
2 голосов
/ 22 марта 2011
dict(((d['unitname'], k), t)
     for d in lst
     for (k, t) in d.iteritems()
     if k != 'unitname')
1 голос
/ 22 марта 2011
dictA = {}
for d in lst:
    unit = d['unitname']
    for test in testnames:
        if test in d:
            dictA[unit,test] = d[test]

Я предполагаю (1), что все диктовки в вашем списке имеют клавишу unitname, (2) что его значение всегда является одной из интересующих вас единиц, (3) что некоторыеу dicts в списке могут быть записи для тестов, которые вас не интересуют, и (4) некоторые тесты, которые вас интересуют, могут отсутствовать в некоторых тестах в списке.Эти предположения немного произвольны;если что-то не так, то не составит труда настроить код для них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...