从2d列表中给定相同坐标的列表中选择最小值

mb5*_*567 3 python list duplicates python-3.x

我有两个清单:

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]
Run Code Online (Sandbox Code Playgroud)

我试图删除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]
Run Code Online (Sandbox Code Playgroud)

我发现很难制定问题并遍历列表,我不知道如何使用zip功能.任何帮助表示赞赏!

jpp*_*jpp 5

这是一个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]
Run Code Online (Sandbox Code Playgroud)

说明

有3个步骤:

  1. 创建一个字典,将每对键映射到值列表.小心使用tuple必须可以清洗的键.
  2. 对于唯一键,只需提取您的defaultdict键,映射到您,list以便您有一个列表列表而不是元组列表.
  3. 对于最小值,使用mapmin.

订购说明

字典是在Python 3.6+中排序的,这可以在3.7+中依赖.在早期版本中,您可以依赖于顺序之间的一致性,dd.keys并且dd.values在访问键和值之间不会发生任何操作.