У меня есть список точек, как показано ниже
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?
Спасибо
Например:
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 беспокоит вас в целях масштабируемости).
operator
, вы можете пропустить функцию getxy
и использовать operator.itemgetter(slice(0,2))
в качестве ключа. Нет причин для обходов Python-C-Python.
Если я понимаю ваш вопрос... возможно, используйте словарь для отображения (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
Хотя заказ будет потерян
Вы можете использовать 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()]
Возможно, есть способ улучшить это, но он удовлетворяет всем вашим требованиям.