2016-09-26 72 views
0

我有列表的列表,我希望創建一個字典,每個元素的長度作爲值。我試過如下:自定義列表到詞典

tmp = [['A', 'B', 'E'], ['B', 'E', 'F'], ['A', 'G']] 
tab = [] 
for line in tmp: 
    tab.append(dict((k, len(tmp)) for k in line)) 

但它給輸出爲:

[{'A': 3, 'B': 3, 'E': 3}, {'B': 3, 'E': 3, 'F': 3}, {'A': 3, 'G': 3}] 

什麼是我應該得到的輸出修改:

{['A', 'B', 'E']:3, ['B', 'E', 'F']:3, ['A', 'G']:2} 

在此先感謝。

AP

+1

你不能有一個列表作爲密鑰 –

+0

@ Farhan.K。好。當我嘗試時,tab.append(dict((len(tmp),k)for k in line));我得到了〜[<發生器對象 0x1041e81e0>,<發生器對象 0x1041e8370>,<發生器對象 0x1041e8320>]〜。這是什麼意思 ? – Arun

回答

3

不能使用list對象作爲字典鍵,它們是可變的,unhashable。你可以將它們轉換爲元組。還要注意,你正在循環每個子列表。你可以只遍歷主列表用生成器表達式:

In [3]: dict((tuple(sub), len(sub)) for sub in tmp) 
Out[3]: {('A', 'B', 'E'): 3, ('A', 'G'): 2, ('B', 'E', 'F'): 3} 
+0

@Arun我不知道你的用例是什麼,但是如果你想忽略字典中鍵的元素順序,你應該使用frozenset而不是元組。 –

1
{tuple(t):len(t) for t in tmp} 

輸入:

[['A', 'B', 'E'], ['B', 'E', 'F'], ['A', 'G']] 

輸出:

{('A', 'G'): 2, ('A', 'B', 'E'): 3, ('B', 'E', 'F'): 3} 

Dictionnary不接受列表爲重點,但元組