【问题标题】:Choose smallest value from lists given same coordinates in 2d list从二维列表中给定相同坐标的列表中选择最小值
【发布时间】:2019-04-02 12:37:22
【问题描述】:

我有两个列表:

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 功能。任何帮助表示赞赏!

【问题讨论】:

  • 您是否愿意使用 3rd 方库(例如 Pandas、NumPy),或者您正在寻找纯 Python 解决方案?
  • 结果是否需要与原始列表的顺序相同?

标签: python python-3.x list duplicates


【解决方案1】:

这是一个使用 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. 对于 唯一 键,只需提取您的 defaultdict 键,映射到 list,这样您就有一个列表列表而不是元组列表。
  3. 对于最小值,请使用 mapmin

订购注意事项

字典在 Python 3.6+ 中是插入排序的,这可以在 3.7+ 中依赖。在早期版本中,您可以依赖dd.keysdd.values 之间的排序一致性,前提是在访问键和值之间没有发生任何操作。

【讨论】:

  • 我已经开始使用combinationenumerate 以及所有爵士乐来编写解决方案......但这要简单得多。不过,欢迎对新手进行更多解释。基本上,创建一个字典,将来自a 的唯一值映射到来自b 的值放在一个列表中。然后你可以只list() 那个字典的键并获取它们的min() 值。
  • @BramVanroy,当然,我已经尝试添加更多解释。
  • 太棒了!对每个人都非常有帮助。 +1
猜你喜欢
  • 2020-09-14
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多