Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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_List - Fatal编程技术网

Python 根据元组中的值,从列表中删除重复元组

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) ] 现在我想删除路径(第一个元素)与其他元组相同的元组,同时保留其中

我有一个元组列表。每个元组包含2个元素:

  • 第一个元素是一个包含一些数字的元组,例如(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()花费多一点时间