2014-02-28 39 views
1

我有這個列表。將幾個值的元組列表轉換爲Python中的字典

List1 = [(1L, 'Jack', 129L, 37L), (2L, 'Tom', 231L, 23L)] 

我想將它轉換成看起來像這樣的字典;

Dict1 = {'1L': [('Jack', 129L, 37L)], '2L': [('Tom', 231L, 23L)]} 

我試圖Dict1 = dict(List1)但得到的東西,如一個錯誤「字典更新序列元素#0的長度爲XX ......」

這怎麼能在Python做呢?我正在使用Python 2.7

回答

4

構造函數dict可以在鍵/值對列表上工作,但不能處理任意長度序列列表。一個簡潔的方法是切開每個子序列與發電機的表達:

Dict1 = dict((sublist[0], sublist[1:]) for sublist in List1) 

因爲你是在2.7,你也可以使用字典理解:

Dict1 = {sublist[0]: sublist[1:] for sublist in List1} 

還有其他的方法可以做到這一點,但我認爲這些是Pythonic最多的 - 對支持該語法的版本的詞典理解(2.7或更高版本)或早期版本的生成器表達式。在這兩種形式中,您都明確聲明瞭字典是將每個子列表的第一個元素作爲關鍵字,其他都作爲值 - 字典對每個關鍵字都有單個值,即使該值本身可能具有多個元素也是如此。

+0

+1的字典理解,這可能是Python 2.7中最好的解決方案。在Python 3中,如果值不是列表而是元組無關緊要,那麼您也可以在'{x:xs for x,* xs in List1}'中執行。 – lvc

+0

@Ivc - 哦,有趣。我以前沒見過使用'*'語法。如果列表中只有一個元素,它是否與切片行爲不同? –

+0

不,假設RHS對象上的一個切片返回列表'a,* b = [1]'給出a = 1和b = []。 'a,b,* c = [1]'給出'ValueError'。所有沒有明星的變量都會按照正常的迭代解包進行解壓縮(除了星號之後的任何*被分配給* last * RHS項目),然後已加星標的變量將得到所有其餘元素的列表。與切片相比,主要區別在於它使用迭代器協議,星號保證是一個列表 - 所以它更像是使用'list(islice(RHS,1,None))'。 – lvc

1

這應該工作:

>>> Dict1 = {} 
>>> for each in List1: 
...  Dict1[each[0]] = [each[1:]] 

更簡潔的一行將

>>> dict((each[0], each[1:]) for each in List1) 

在這兩種情況下,輸出是:

{1L: [('Jack', 129L, 37L)], 2L: [('Tom', 231L, 23L)]}