我有两个列表:
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函数。任何帮助表示赞赏!
答案 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个步骤:
tuple
作为键,该键必须是可哈希的。defaultdict
键,映射到list
,以便您拥有列表列表而不是元组列表。map
与min
一起使用。字典在Python 3.6+中是按插入顺序排列的,而在3.7+中可以依赖。在早期版本中,如果在键和值的访问之间未进行任何操作,则可以依靠dd.keys
和dd.values
之间的一致性排序。