2015-12-14 123 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

下面的解決方案是一種醜陋的(並且可以通過枚舉和zip來美化),但似乎做你想要它做的事情:

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