[英]converting list of lists to dictionary
我有一個列表列表,如下所示:
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'
如果您不關心具有零值的鍵,則應該這樣做:
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]))
下面的解決方案有點丑陋(可以使用enumerate和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]
我不確定在實踐中我是否會一口氣做到這一點,但是使用字典理解完全相同:
{key: {key2: value for key2, value in zip(g, row) if value != 0}
for key, row in zip(g, list1)}
首先,我將編寫兩個函數,一個將列表轉換成字典,然后從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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.