[英]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.