2014-12-19 2 views
0

У меня есть список l1, как показано ниже:Python: Создание словаря с помощью списка список, список кортежей и список

l1 = [[(1,"INC1"), (1, "INC2")],[(3, "INC4"),(4, "INC6")]] 

У меня есть список names, как показано ниже:

names = ['John', 'Marcia'] 

I есть еще один список label_issue_list, как показано ниже:

label_issue_list = [["Problem1","Problem1"],["Problem3","Problem4"]] 

индексы о f все три списка подключены, как показано на следующем выходе.

Я пытаюсь использовать все эти три список и получить словарный выход, который хотел бы ниже:

{ 
"John" : { 
      "Problem1" : 2, 
      "tick_info" : {"1": ["INC1", "INC2"]} 

      }, 
"Marcia" : { 
      "Problem3" : 1, 
      "Problem4" : 1, 
      "tick_info" : {"3":["INC4"], "4":["INC6"]} 
      } 
} 

Я попытался код ниже, но это не похоже на работу:

clust_stack = {} 
for i in range(len(l1)): 
     fq= defaultdict(list) 
     for n,v in l1[i]: 
      fq[str(n)].append(v) 
     for name_, data in zip(names, label_issue_list)[i]: 
      clust_stack[name_] = Counter(map(str,data)) 
      clust_stack[name_]["tick_info"] = {} 
      clust_stack[name_]["tick_info"] = dict(fq) 

Я получаю ошибку ниже в for name_, data in zip(names, label_issue_list)[i]: линии:

ValueError: too many values to unpack 

Что я п чтобы сделать мой желаемый результат?

ответ

1

Начните с проносясь все 3 списка:

clust_stack = {} 
for name, data, fq in zip(names, label_issue_list, l1): 
    clust_stack[name] = dict(Counter(data)) # turn back into regular dictionary 
    tick_info = clust_stack[name]['tick_info'] = {} 
    for num, tick in fq: 
     tick_info.setdefault(num, []).append(tick) 

Использование Counter для подсчета информации в каждом l1 элемент отлично, но вы должны превратить этот результат обратно в обычный словарь, так что вы можете добавить другие ключи к нему.

К нему можно добавить ключ tick_info, собирая информацию из этих списков в значениях списка за ключ.

Демо:

>>> from collections import Counter 
>>> from pprint import pprint 
>>> l1 = [[(1,"INC1"), (1, "INC2")],[(3, "INC4"),(4, "INC6")]] 
>>> names = ['John', 'Marcia'] 
>>> label_issue_list = [["Problem1","Problem1"],["Problem3","Problem4"]] 
>>> clust_stack = {} 
>>> for name, data, fq in zip(names, label_issue_list, l1): 
...  clust_stack[name] = dict(Counter(data)) # turn back into regular dictionary 
...  tick_info = clust_stack[name]['tick_info'] = {} 
...  for num, tick in fq: 
...   tick_info.setdefault(num, []).append(tick) 
... 
>>> pprint(clust_stack) 
{'John': {'Problem1': 2, 'tick_info': {1: ['INC1', 'INC2']}}, 
'Marcia': {'Problem3': 1, 
      'Problem4': 1, 
      'tick_info': {3: ['INC4'], 4: ['INC6']}}} 
+0

Большое спасибо !! Это работает!! :) – user1452759

Смежные вопросы