我有這樣的元組的列表:獲取與每個鍵最大值元組
[(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]
我想保持它有每條記錄的最大值第一個值具有相同的元組第二值。例如,(2, 1)
和(3, 1)
共享相同的第二個(鍵)值,所以我只想保留最大的第一個值 - >(3, 1)
。最後,我會得到這樣的:
[(1, 0), (3, 1), (6, 2), (2, 3)]
我根本就不如果它不是一個班輪介意,但我想知道一個有效的方法去這個...
我有這樣的元組的列表:獲取與每個鍵最大值元組
[(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]
我想保持它有每條記錄的最大值第一個值具有相同的元組第二值。例如,(2, 1)
和(3, 1)
共享相同的第二個(鍵)值,所以我只想保留最大的第一個值 - >(3, 1)
。最後,我會得到這樣的:
[(1, 0), (3, 1), (6, 2), (2, 3)]
我根本就不如果它不是一個班輪介意,但我想知道一個有效的方法去這個...
from operator import itemgetter
from itertools import groupby
[max(items) for key, items in groupby(L,key = itemgetter(1))]
它假設您初始的元組列表是按鍵值排序的。
groupby
創建一個迭代器,產生像(0, <itertools._grouper object at 0x01321330>)
這樣的對象,其中第一個值是鍵值,第二個是另一個迭代器,它爲所有元組提供該鍵。
max(items)
只選擇具有最大值的元組,並且由於該組的所有第二個值都是相同的(並且也是關鍵字),它會爲元組提供最大的第一個值。
列表理解用於基於這些函數的輸出形成元組的輸出列表。
import itertools
import operator
l = [(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]
result = list(max(v, key=operator.itemgetter(0)) for k, v in itertools.groupby(l, operator.itemgetter(1)))
您可以使用鍵元組的第二個元素的字典:
l = [(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]
d = dict([(t[1], None) for t in l])
for v, k in l:
if d[k] < v:
d[k] = v
l2 = [ (v, k) for (k, v) in d.items() if v != None ]
print l2
基於itertools的解決方案是a)可能更快,b)更優雅。使用其中之一。 –
我不能告訴你在問什麼。什麼最大? – TorelTwiddler
我試圖說清楚,但我不確定我是否成功 – vascop