簡體   English   中英

返回每組價值最高的列表

[英]Return lists that have the highest value per group

我目前有一個要整理的位置列表。

該列表如下所示:

list = [['Location 1', 5],['Location 2', 5],['Location 3', 5],['Location 1', 4],['Location 2', 6],['Location 3', 5],['Location 1', 5],['Location 2', 5]]

目標是為每個位置選擇索引1中每個列表的最大值。 最終結果應如下所示:

correctList = [['Location 1', 5],['Location 2', 6],['Location 3', 5]]

具有相同整數值的位置沒有首選項。

我現在擁有的解決方案是根據名稱將每個位置附加到自己的列表中。 然后從每個列表中使用每個位置列表上的max()操作。

一旦使用第一個元素對列表進行了排序,就可以使用itertools.groupby選擇第二個元素max的列表:

s = sorted(l, key=lambda x: x[0])
[max(k) for i,k in groupby(s, key=lambda x: x[0])]
[['Location 1', 5], ['Location 2', 6], ['Location 3', 5]]

哪里:

sorted(l, key=lambda x: x[0])

[['Location 1', 5],
 ['Location 1', 4],
 ['Location 1', 5],
 ['Location 2', 5],
 ['Location 2', 6],
 ['Location 2', 5],
 ['Location 3', 5],
 ['Location 3', 5]]

請注意,當輸入一組列表時, max將提供所需的輸出:

max(['Location 1', 5], ['Location 1', 4], ['Location 1', 5])
#['Location 1', 5]

您可以將collections.defaultdict用於O( n )解決方案:

from collections import defaultdict

L = [['Location 1', 5],['Location 2', 5],['Location 3', 5],['Location 1', 4],
     ['Location 2', 6],['Location 3', 5],['Location 1', 5],['Location 2', 5]]

dd = defaultdict(int)

for location, value in L:
    dd[location] = max(dd[location], value)

print(dd)
# defaultdict(int, {'Location 1': 5, 'Location 2': 6, 'Location 3': 5})

這給出了字典映射。 如果您熱衷於列表列表:

res = list(map(list, dd.items()))

print(res)
# [['Location 1', 5], ['Location 2', 6], ['Location 3', 5]]

您可以使用字典來計算O(n)中每個位置的最大值:

data = [['Location 1', 5], ['Location 2', 5], ['Location 3', 5], ['Location 1', 4], ['Location 2', 6],
        ['Location 3', 5], ['Location 1', 5], ['Location 2', 5]]

groups = {}
for location, value in data:
    if location not in groups:
        groups[location] = value
    else:
        groups[location] = max(groups[location], value)

result = [[location, value] for location, value in groups.items()]

print(result)

產量

[['Location 1', 5], ['Location 2', 6], ['Location 3', 5]]

您可以使用pandas ,這很容易按一個鍵分組並為每個分組計算一些內容:

import pandas as pd

df = pd.DataFrame([['Location 1', 5],['Location 2', 5],['Location 3', 5],['Location 1', 4],['Location 2', 6],['Location 3', 5],['Location 1', 5],['Location 2', 5]],
                  columns=["location", "value"])
df.groupby("location").max()
#             value
# location         
# Location 1      5
# Location 2      6
# Location 3      5

如果之后絕對需要列表列表,則也可以:

df.groupby("location").max().reset_index().values.tolist()
# [['Location 1', 5], ['Location 2', 6], ['Location 3', 5]]

請注意,如果這是您唯一要處理的數據,則可能是過大了。 但是,如果您需要對其進行更多分析,那么習慣pandas可以加快很多工作,因為它的大多數方法都是矢量化的,並且是用C語言編寫的。

暫無
暫無

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

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