Поиск уникальных максимальных значений в списке с помощью Python

1

У меня есть список точек, как показано ниже

points=[ [x0,y0,v0],  [x1,y1,v1],  [x2,y2,v2].......... [xn,yn,vn]]

Некоторые из точек имеют повторяющиеся значения x, y. Я хочу сделать, чтобы извлечь уникальное максимальное значение x, y points

Например, если у меня есть точки [1,2,5] [1,1,3] [1,2,7] [1,7,3]

Я хотел бы получить список [1,1,3] [1,2,7] [1,7,3]

Как я могу сделать это в python?

Спасибо

  • 2
    Извините, но не могли бы вы перефразировать это? Я не понимаю, почему вы только что удалили первый элемент из исходного списка, хотя он имеет более высокое значение y, чем первый возвращенный элемент ...
  • 1
    Вопрос не очень понятный, что такое уникальный максимум? это устоявшееся понятие в какой-то области математики? или это термин, который вы придумали, чтобы описать вашу проблему?
Теги:
set
unique

3 ответа

8
Лучший ответ

Например:

import itertools

def getxy(point): return point[:2]

sortedpoints = sorted(points, key=getxy)

results = []

for xy, g in itertools.groupby(sortedpoints, key=getxy):
  results.append(max(g, key=operator.itemgetter(2)))

то есть: сортировать и группировать точки по xy, для каждой группы с фиксированным xy выбираем точку с максимальным z. Кажется простым, если вам удобно с itertools (и вы должны быть, это действительно очень мощный и полезный модуль!).

В качестве альтернативы вы можете построить dict с (x,y) кортежами как ключи и списки z в качестве значений и сделать один последний проход на этом, чтобы выбрать max z для каждого (x, y), но я думаю, что сортировка - и групповой подход предпочтительнее (если у вас много миллионов точек, так что, по-моему, производительность сортировки по размеру-O беспокоит вас в целях масштабируемости).

  • 0
    Спасибо, Алекс, нет, я не знаком с itertools, но скоро буду. Еще раз спасибо, очень ценю ваше время
  • 0
    Поскольку вы уже используете модуль operator , вы можете пропустить функцию getxy и использовать operator.itemgetter(slice(0,2)) в качестве ключа. Нет причин для обходов Python-C-Python.
Показать ещё 1 комментарий
0

Если я понимаю ваш вопрос... возможно, используйте словарь для отображения (x,y) в max z

что-то вроде этого (не проверено)

dict = {}
for x,y,z in list
    if dict.has_key((x,y)):
        dict[(x,y)] = max(dict[(x,y)], z)
    else:
        dict[(x,y)] = z

Хотя заказ будет потерян

0

Вы можете использовать dict для этого, используя свойство: "Если данный ключ просматривается более одного раза, последнее значение связанный с ним, сохраняется в новом словаре". Этот код сортирует точки, чтобы удостовериться, что самые высокие значения приходят позже, создает словарь, ключи которого являются кортежем первых двух значений и значение которого является третьей координатой, а затем переводит это обратно в список

points = [[1,2,5], [1,1,3], [1,2,7], [1,7,3]]
sp = sorted(points)
d = dict( ( (a,b), c) for (a,b,c) in sp)
results = [list(k) + [v] for (k,v) in d.iteritems()]

Возможно, есть способ улучшить это, но он удовлетворяет всем вашим требованиям.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню