从二维列表中具有相同坐标的列表中选择最小值

时间:2018-10-29 14:40:48

标签: python python-3.x list duplicates

我有两个列表:

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 :(得分:5)

这是一个使用collections.defaultdict的O( n )解决方案:

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. 对于 unique 键,只需提取您的defaultdict键,映射到list,以便您拥有列表列表而不是元组列表。
  3. 要获取最小值,请将mapmin一起使用。

订购须知

字典在Python 3.6+中是按插入顺序排列的,而在3.7+中可以依赖。在早期版本中,如果在键和值的访问之间未进行任何操作,则可以依靠dd.keysdd.values之间的一致性排序。