2013-01-10 80 views
4

如果我有兩個列表元組轉換3元元組的列表,以字典

tuple2list=[(4, 21), (5, 10), (3, 8), (6, 7)] 

tuple3list=[(4, 180, 21), (5, 90, 10), (3, 270, 8), (6, 0, 7)] 

如何將其轉換爲如下字典的,

tuple2list2dict={4:21, 5:10, 3:8, 6:7} 

tuple3list2dict={4: {180:21}, 5:{90:10}, 3:{270:8}, 6:{0:7}} 

我知道如何做到這一點的在元組,使用2個元素,

tuple2list2dict=dict((x[0], index) for index,x in enumerate(tuple2list)) 

但對於3個元素我有問題,已經嘗試下面的錯誤,

tuple3list2dict=dict((x[0], dict(x[1], index)) for index,x in enumerate(tuple3list)) 

如何重複使用上述代碼來創建3個元素的字典?

任何指針讚賞或指向我在哪裏可以閱讀更多關於此。無法在互聯網上找到它。

+4

Python變量名不能啓動整數。 – GWW

+9

您的「3tuplelist2dict」是一個帶有鍵「4」的字典,列出了兩次。這不是一個有效的Python字典。 「2tuplelist2dict」遭受同樣的問題。 – unutbu

+0

@unutbu和GWW - 對不起,我犯了一些錯別字。已妥善糾正以上。感謝您突出顯示 –

回答

6

在Python2.7或更高版本,你可以使用字典理解:

In [100]: tuplelist = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)] 

In [101]: tuplelist2dict = {a:{b:c} for a,b,c in tuplelist} 

In [102]: tuplelist2dict 
Out[102]: {3: {270: 8}, 4: {0: 7}, 5: {90: 10}} 

在python2.6的或以上,相當於將

In [26]: tuplelist2dict = dict((a,{b:c}) for a,b,c in tuplelist) 

注意的是,如果第一個值元組出現不止一次(如上例),結果tuplelist2dict只包含一個鍵值對 - 對應於帶有共享密鑰的最後一個元組。

+0

反正它有沒有被覆蓋並保留所有{key:{key:value}}對。 –

+0

在這種情況下,您不能使用字典。你將不得不使用元組或列表。 – unutbu

+0

或者,第二,雖然你可以使用字典,如果該值是一個列表。例如,'{4:[{0:7},{180:21}]}'。 – unutbu

2

這雙例是簡單的,因爲它與dict construction對齊:

...的位置參數必須是迭代器對象。 iterable中的每個項目本身都必須是一個迭代器,其中恰好是兩個對象。每個項目的第一個對象成爲新字典中的一個鍵,第二個對象成爲相應的值。

>>> t = [(4, 21), (5, 10), (3, 8), (4, 7)] 
>>> dict(t) 
{3: 8, 4: 7, 5: 10} 

三重情況下可以用這種方法來解決:

>>> t = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)] 
>>> dict([ (k, [v, w]) for k, v, w in t ]) 
{3: [270, 8], 4: [0, 7], 5: [90, 10]} 

或者多一點一般:

>>> dict([ (k[0], k[1:]) for k in t ]) # hello car, hi cdr 
{3: (270, 8), 4: (0, 7), 5: (90, 10)} 

需要注意的是你的代碼:

_3_tuplelist_to_dict = {4: {180:21}, 5:{90:10}, 3:{270:8}, 4:{0:7}} 

是真的這只是一個令人困惑的表示:

{3: {270: 8}, 4: {0: 7}, 5: {90: 10}} 

嘗試:

>>> {4: {180:21}, 5:{90:10}, 3:{270:8}, 4:{0:7}} == \ 
    {3: {270: 8}, 4: {0: 7}, 5: {90: 10}} 
True 

使用Python 3,你可以使用字典理解:

>>> t = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)] 
>>> {key: values for key, *values in t} 
{3: [270, 8], 4: [0, 7], 5: [90, 10]} 
+1

在3.x中注意,存在擴展解包,所以對於一般情況,可以簡單地執行''{key:鍵的值,t中的*值}',其讀取非常好。 –

+0

@Lattyware,真的很好,謝謝你的提示,更新了我的答案。 – miku

+0

@miku感謝您的評論,學到了新東西。我在4和錯誤的名稱上做了拼寫錯誤,已經在上面正確地糾正了它。 tuple3list是否可以使用tuple3list2dict創建一個{key {key:value}}關係的字典?如果有任何我可以隨時閱讀的例子,請指點我。 –