2015-12-14 2 views
1

У меня есть список из списка, который выглядит следующим образом:преобразования список списков в словарь

list1 = [ [0, 4, 2, 5, 0, 0], 
      [4, 0, 0, 0, 6, 4], 
      [2, 0, 0, 7, 0, 0], 
      [5, 0, 7, 0, 5, 3], 
      [0, 6, 0, 5, 0, 1], 
      [0, 4, 0, 3, 1, 0], 
     ] 

, который я хочу, чтобы преобразовать в словарь следующим образом:

G = {'a' : { 'b':4, 'c':2, 'd':5}, 
    'b': {'a':4,'e': 6,'f':4}, 
    'c':{ 'a':2,'d':7}, 
    'd':{'a':5, 'c':7, 'e':5,'f':3}, 
    'e':{'b':6, 'd':5,'f':1}, 
    'f' :{'b':4, 'd':3,'e':1} 
} 

У меня есть код для этого требуется только следующее сообщение:

list1 = [ [0, 4, 2, 5, 0, 0], 
    [4, 0, 0, 0, 6, 4], 
    [2, 0, 0, 7, 0, 0], 
    [5, 0, 7, 0, 5, 3], 
    [0, 6, 0, 5, 0, 1], 
    [0, 4, 0, 3, 1, 0], 
] 

g=['a','b','c','d', 'e','f'] 
dl = zip(list1, g) 
dict(dl) 
print dl 

Ошибка:

File "/Users/zakirtatari/Documents/da.py", line 19, in <module> 
     dict(dl) 
    TypeError: unhashable type: 'list' 
+1

Показать об ошибке. Также объясните, как вы думаете, что ваш код должен работать. –

+0

Это единственный пример, о котором вы беспокоитесь? Есть ли более общий случай, когда у вас более 26 строк/столбцов и может закончиться буквами алфавита? – Reti43

ответ

4

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

from string import ascii_lowercase as letters 
dict(zip(letters, [dict(zip(letters, L)) for L in list1])) 

Если вы хотите, чтобы отфильтровать такие ключи можно сделать:

dict(zip(letters, 
     [dict((k, v) for k, v in zip(letters, L) if v) for L in list1])) 
1

Ниже решения является своего рода некрасиво (и может быть prettified с помощью перечисления и зип), но это, кажется, что вы хотите это сделать:

alphabet = "abcdefghijklmnopqrstuvwxyz" 
list1 = [[0,4,2,5,0], [4, 0, 0, 0, 6]] 

g = {} 
for idx in range(len(list1)): 
    g[alphabet[idx]] = {} 
    for idx_2 in range(len(list1[idx])): 
     if list1[idx][idx_2] != 0: 
      g[alphabet[idx]][alphabet[idx_2]] = list1[idx][idx_2] 
1

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

{key: {key2: value for key2, value in zip(g, row) if value != 0} 
for key, row in zip(g, list1)} 
1

Сначала я хотел написать две функции, одно преобразование список в словарь, поиск ключей от ascii_lowercase другой проходит через словари и отфильтровывает пары ключ-значение, значения которых равны нулю.

from string import ascii_lowercase 

def list_to_dict(in_list): 
    return dict([(k, v) for k, v in zip(ascii_lowercase, in_list)]) 

def filter_dict(in_dict): 
    return dict([(k, v) for k, v in in_dict.items() if v != 0]) 

Тогда вся логика помещается в одном операторе список итератора:

list1 = list_to_dict([filter_dict(list_to_dict(x)) for x in list1 ]) 

Во-первых, пройти через каждый «строки» и превратить их в словарях, а затем фильтровать словари по значениям, которые равны нуль.

Выполните ту же функцию против списка словарей и превратите их в пары ключ-значение.

Возможно, вы захотите использовать порядок OrderedDict, если хотите сохранить порядок элементов.

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