Выберите наименьшее значение из списков с такими же координатами в 2-м списке - PullRequest
0 голосов
/ 29 октября 2018

У меня есть два списка:

a = [[9, 5], [9, 10000], [9, 10000], [5, 10000], [5, 10000], [10001, 10], [10001, 10]]
b = [19144.85, 8824.73, 26243.88, 23348.02, 40767.17, 55613.43, 40188.8]

Я пытаюсь удалить повторяющиеся координаты в a и удалить соседнее значение в b, но оставив наименьшее значение. Так, например, координата [9,10000] повторяется дважды со значениями в b, равными 8824,73 и 26243,88, в результате должны быть два списка, в которых имеется только один [9,10000] с меньшим из b, равным 8824,73

.

Таким образом, в целом результат должен выглядеть следующим образом:

aa = [[9,5],[9,10000],[5,10000],[10001,10]]
bb = [19144.85, 8824.73, 23348.02, 40188.8]

Мне трудно сформулировать проблему и перебрать списки, и я не уверен, как я могу использовать функцию zip. Любая помощь приветствуется!

1 Ответ

0 голосов
/ 29 октября 2018

Вот решение O ( n ) с использованием collections.defaultdict:

from collections import defaultdict

dd = defaultdict(list)

for (key1, key2), value in zip(a, b):
    dd[(key1, key2)].append(value)

aa = list(map(list, dd))
bb = list(map(min, dd.values()))

print(aa, bb, sep='\n'*2)

[[9, 5], [9, 10000], [5, 10000], [10001, 10]]

[19144.85, 8824.73, 23348.02, 40188.8]

Объяснение

Есть 3 шага:

  1. Создать словарь, отображающий каждую пару ключей в список значений. Осторожно используйте tuple в качестве ключей, которые должны быть хэшируемыми.
  2. Для уникальных ключей, просто извлеките ваши defaultdict ключи, сопоставив их с list, чтобы у вас был список списков вместо списка кортежей.
  3. Для минимальных значений используйте map с min.

Примечание по заказу

Словари упорядочены в Python 3.6+, на что можно положиться в 3.7+. В более ранних версиях вы можете рассчитывать на согласованность порядка между dd.keys и dd.values при условии, что между доступом к ключам и значениям не было выполнено никаких операций.

...