Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回每个组具有最高值的列表_Python - Fatal编程技术网

Python 返回每个组具有最高值的列表

Python 返回每个组具有最高值的列表,python,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],['Loc

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

列表如下所示:

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()
操作从每个列表中删除

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

输出

[['Location 1', 5], ['Location 2', 6], ['Location 3', 5]]
使用第一个元素对列表进行排序后,您可以使用选择带有第二个元素的列表:

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]
可用于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]]
您可以使用此功能,按一个键分组并为每个组计算一些内容非常容易:

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编写的。

您的解决方案不起作用吗?请分享您的尝试,以便我们可以给您提供明智的建议。这就是说,这似乎是字典的标准用例。你试过在这里使用它们吗?对于这个问题来说,这似乎是矫枉过正。既然字典就足够了,为什么还要使用外部库呢?@JordanSinger:因为他们以后可能会想用它做更多涉及的事情。但这不是问题的目的,只会增加代码的开销。@JordanSinger:是的。然而,它确实解决了这个问题。对于大型列表,只要您使用它做其他事情,它甚至会更快(因为将列表消费到数据帧中可能是瓶颈,
pandas
主要是用C实现的)@JordanSinger:无论如何,在回答中添加了一个免责声明,这可能是过火了。
df.groupby("location").max().reset_index().values.tolist()
# [['Location 1', 5], ['Location 2', 6], ['Location 3', 5]]