Python 根据元组中的值,从列表中删除重复元组
我有一个元组列表。每个元组包含2个元素:Python 根据元组中的值,从列表中删除重复元组,python,list,Python,List,我有一个元组列表。每个元组包含2个元素: 第一个元素是一个包含一些数字的元组,例如(1,4,2)。这 实际上是一个路径,其中的数字是节点的ID 第二个元素是一个数字,它是路径的分数 例如,该列表可以是 pathList = [ ((1, 2), 4), ((1, 4, 2), 2), ((1, 2), 6), ((1, 2), 3), ((1, 4, 2), 3) ] 现在我想删除路径(第一个元素)与其他元组相同的元组,同时保留其中
- 第一个元素是一个包含一些数字的元组,例如(1,4,2)。这 实际上是一个路径,其中的数字是节点的ID
- 第二个元素是一个数字,它是路径的分数
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)
]
顺序并不重要
有没有一种有效的方法可以做到这一点?您可以使用字典(方法)将您的路径保留为关键分数,并将相对分数保留为一组值(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)]
或者您可以使用熊猫和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
我认为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
O(1)添加值的复杂性-即使是带有列表的原始版本也有O(1)添加值的复杂性(如您使用的
append
)@thefourtheye确实如此,但调用list.append
要比set.add()花费多一点时间