返回每组价值最高的列表

时间:2019-01-14 17:16:14

标签: python

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

列表如下所示:

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()操作从每个列表中进行。

4 个答案:

答案 0 :(得分:1)

一旦使用第一个元素对列表进行了排序,您就可以使用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]

答案 1 :(得分:1)

您可以将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]]

答案 2 :(得分:0)

您可以使用字典来计算 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]]

答案 3 :(得分:0)

您可以使用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编写的。