Удаление повторяющихся кортежей из списка в зависимости от значений в кортежах
У меня есть список кортежей. Каждый кортеж содержит 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)
]
Порядок не важен.
Есть ли эффективный способ сделать это?
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