簡體   English   中英

使用 itemgetter 和 list comp 過濾元組列表,以便根據元組中的第二項獲取唯一項

[英]Filtering list of tuples using itemgetter and list comp in order to get unique items based on the second item in the tuple

我有一個這樣的列表:

a = [(1800000.0, 'google'), (1440000.0, 'IBM'), (1260000.0, 'google'), (1008000.0, 'IBM'),
(990000.0, 'google'), (792000.0, 'IBM'), (720000.0, 'FB'), (600000.0, 'google'), 
(504000.0,'FB'), (480000.0, 'IBM'), (420000.0, 'google'), (400000.0, 'google'),
(396000.0, 'FB'), (336000.0, 'IBM'), (330000.0, 'google'), (320000.0, 'IBM'),
(280000.0, 'google'), (264000.0, 'IBM'), (240000.0, 'FB'), (224000.0, 'IBM'),
(220000.0, 'google'), (176000.0, 'IBM'), (168000.0, 'FB'), (160000.0, 'FB'),
(132000.0, 'FB'), (112000.0, 'FB'), (88000.0, 'FB')]

我想使用 itemgetter 獲得以下內容。 它是元組中第一個項目的最大值,每個元組的第二個項目是唯一的:

[(1800000.0, 'google'), (1440000.0, 'IBM'), (720000.0, 'FB')]

我試過的:

[max(items) for key, items in groupby(a,key = itemgetter(1))]

但它返回完整列表,盡管它是公認的答案

如何使用帶有列表理解的itemgetter實現所需的輸出?

itertools.groupby根據某個鍵對連續的相等值進行分組。 要使其工作,您必須根據第二個字段進行排序。 但是,對於我們需要的東西,復雜性變得不必要地高。

在這里,您可能最好使用字典。 默認情況下,我們可以將鍵設置為0並在找到更高的值時進行更新:

d = {}
for v,k in a:
     if d.setdefault(k, 0) < v:
            d[k] = v

print(d)
{'google': 1800000.0, 'IBM': 1440000.0, 'FB': 720000.0}

要獲得與上述相同的格式:

[(v,k) for k,v in d.items()]
[(1800000.0, 'google'), (1440000.0, 'IBM'), (720000.0, 'FB')]

groupby()僅適用於相鄰的相似元素。 您需要首先按相同的鍵( sorted(a, key=itemgetter(1)) )對列表進行排序,如果您希望它捕獲並組合具有相同鍵的所有元素:

[max(items) for _, items in groupby(sorted(a, key=itemgetter(1)), key = itemgetter(1))]
# [(720000.0, 'FB'), (1440000.0, 'IBM'), (1800000.0, 'google')]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM