Удаление повторяющихся кортежей из списка в зависимости от значений в кортежах



У меня есть список кортежей. Каждый кортеж содержит 2 элемента:



    1-й элемент-это кортеж с некоторыми числами, например (1, 4, 2). Этот
    это фактически путь, номера в котором являются идентификаторами узлов.
    2-й элемент - это число, которое является счетом пути.

Например, список может быть



pathList = [
((1, 2), 4),
((1, 4, 2), 2),
((1, 2), 6),
((1, 2), 3),
((1, 4, 2), 3)
]


Теперь я хочу удалить кортежи, которые имеют те же пути (1-й элемент), что и другие, сохраняя при этом тот, который имеет самый высокий балл (2-й элемент) среди их.



Например, после процесса pathList должно быть



pathList = [
((1, 2), 6),
((1, 4, 2), 3)
]


Порядок не важен.



Есть ли эффективный способ сделать это?
559   3  

3 ответов:

Вы можете использовать словарь (дикт.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)]

Или вы можете использовать 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

Я думаю, что самое лучшее в 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

Comments

    Ничего не найдено.