2015-02-08 19 views
0

我想比較的元組的兩個列表,並創建一個元組的第三列表,其中包含兩個最高值:建立的元組的第三名單有兩個來源

b = [(u'eventId', 0), (u'playerId', 0), (u'expandedMinute', 0), \ 
(u'second', 0), (u'endY', 00.0), (u'teamId', 0), (u'endX', 00.0), (u'y', 00.0), (u'x', 00.0), \ 
(u'isTouch', 'Null'), (u'id', 0.0), (u'minute', 0)] 

c = [(u'expandedMinute', 93), \ 
(u'second', 47), (u'endY', 67.8), (u'teamId', 32), (u'endX', 91.0), \ 
(u'y', 83.8), (u'x', 88.1), (u'isTouch', True), (u'id', 2136355953.0), \ 
(u'minute', 91)] 


d={k:c[k] if k in c and c[k]>b[k] else v for k,v in b.items()} 
print [(k, v) for k, v in d.items()] 

我已經做了類似的事情之前用一對字典,並能夠使用以'd ='開頭的邏輯來獲得這個工作,但它不再適合我目前的情況。

所需的輸出應該是這樣的(前兩個元組,「事件ID」和「playerId」,這是在B,但不是C被添加到元組的最後的列表):

[(u'eventId', 0), (u'playerId', 0), (u'expandedMinute', 93), \ 
(u'second', 47), (u'endY', 67.8), (u'teamId', 32), (u'endX', 91.0), \ 
(u'y', 83.8), (u'x', 88.1), (u'isTouch', True), (u'id', 2136355953.0), \ 
(u'minute', 91)] 

在我的場景中,'C'將只包含與'B'或其子集相同的內容。它永遠不會包含額外的元組項目。

任何人都可以用我需要的邏輯來完成我的代碼嗎?

由於元組這一下真像鍵值對

+0

是否有您所使用的元組的列表,而不是一本字典的理由(如果訂單對你來說很重要,可能是'OrderedDict')? – DSM 2015-02-08 23:11:00

+0

@DSM是的,因爲元組列表是通過壓縮它們從兩個列表創建的。 – gdogg371 2015-02-08 23:12:32

+0

這並沒有真正解釋它,因爲除非你有一個重複的「關鍵」,或者關心順序,否則你可以輕鬆地完成'dict(zip(list0,list1))'。字典有一個'.update'方法。 – DSM 2015-02-08 23:15:01

回答

0

列表尖叫爲OrderedDict。假設你希望更新的值:

>>> from collections import OrderedDict 
>>> bd = OrderedDict(b) 
>>> cd = OrderedDict(c) 
>>> newd = bd.copy() 
>>> newd.update(cd) 
>>> newd 
OrderedDict([(u'eventId', 0), (u'playerId', 0), (u'expandedMinute', 93), (u'second', 47), (u'endY', 67.8), (u'teamId', 32), (u'endX', 91.0), (u'y', 83.8), (u'x', 88.1), (u'isTouch', True), (u'id', 2136355953.0), (u'minute', 91)]) 

但是,如果你堅持一個元組的列表:

>>> print newd.items() 
[(u'eventId', 0), (u'playerId', 0), (u'expandedMinute', 93), 
(u'second', 47), (u'endY', 67.8), (u'teamId', 32), 
(u'endX', 91.0), (u'y', 83.8), (u'x', 88.1), 
(u'isTouch', True), (u'id', 2136355953.0), (u'minute', 91)] 
相關問題