2011-09-28 56 views
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)]

我根本就不如果它不是一個班輪介意,但我想知道一個有效的方法去這個...

+0

我不能告訴你在問什麼。什麼最大? – TorelTwiddler

+0

我試圖說清楚,但我不確定我是否成功 – vascop

回答

5
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)只選擇具有最大值的元組,並且由於該組的所有第二個值都是相同的(並且也是關鍵字),它會爲元組提供最大的第一個值。

列表理解用於基於這些函數的輸出形成元組的輸出列表。

+1

如果不是,你可以這樣做:'L.sort(key = itemgetter(1))'。當然,我們不知道OP是否需要穩定... –

+0

@Zach是的,我正在考慮排序。但是我不確定在KQ中如果在答案中使用字典更有效。由於不需要排序順序中的整個初始列表,所以我們只需要一些元組。 – ovgolovin

+0

排序可能需要重新排列初始列表中的項目,這些項目只需傳遞一次即可形成字典。 – ovgolovin

2

可能使用的字典:

rd = {} 
for V,K in my_tuples: 
    if V > rd.setdefault(K,V): 
    rd[K] = V 
result = [ (V,K) for K,V in rd.items() ] 
+0

+1非常好的短手。 – Serdalis

+0

如果初始列表未排序,我認爲這種方法更有效,因爲它只需要一個傳遞初始列表的元組,因此'O(n)'的複雜性。使用'groupby'迭代器需要初始排序未排序的列表,所以'O(n * log(n))'的複雜性。 – ovgolovin

0
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))) 
0

您可以使用鍵元組的第二個元素的字典:

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 
+1

基於itertools的解決方案是a)可能更快,b)更優雅。使用其中之一。 –