我有一个元组列表。每个元组包含2个元素:
例如,列表可能是
pathList = [
((1, 2), 4),
((1, 4, 2), 2),
((1, 2), 6),
((1, 2), 3),
((1, 4, 2), 3)
]
现在我想删除与其他路径具有相同路径(第一个元素)的元组,同时保留其中具有最高分数(第二个元素)的元组。
例如,在此过程之后,pathList
应为
pathList = [
((1, 2), 6),
((1, 4, 2), 3)
]
订单并不重要。
有没有一种有效的方法呢?
答案 0 :(得分:5)
您可以使用字典(dict.setdefault方法)将路径保存为关键值和相对分数作为值(添加值的O(1)复杂度)值,然后选择每个唯一路径的最大分数:
>>> pathList = [
... ((1, 2), 4),
... ((1, 4, 2), 2),
... ((1, 2), 6),
... ((1, 2), 3),
... ((1, 4, 2), 3)
... ]
>>>
>>> d={}
>>> for i,j in pathList:
... d.setdefault(i,set()).add(j)
...
>>> [(i,max(j)) for i,j in d.items()]
[((1, 2), 6), ((1, 4, 2), 3)]
答案 1 :(得分:1)
或者你可以使用pandas和groupby:
import pandas as pd
pathList = [
((1, 2), 4),
((1, 4, 2), 2),
((1, 2), 6),
((1, 2), 3),
((1, 4, 2), 3)
]
df = pd.DataFrame(pathList, columns=["elements", "occurences"])
max_only = []
for name, group in df.groupby("elements"):
max_only.append([name, group.occurences.max()])
print max_only
答案 2 :(得分:1)
我认为关于python的最好的事情是脚本总是很简单, 我只是在这里排序列表。
newPathList =[]
pathList = sorted(pathList, reverse =True)
oldx = 0
for i in pathList:
x,y = i
if x!= oldx:
newPathList.append(i)
oldx = x
print newPathList