我遇到了一些我找不到解决方案的问题。
我有一个看起来像他的列表,实际上有 60000 个元素:
lst = [[0, [-24.75, -24.75, -25.0], 0.00001, 2],
[10, [-26, -26, -26], 0.00011, 4],
[0, [-3, -200000, -25.0], 0.000009, 42],
[0, [-4, -4.7, -5], 0.00801, 7],
[1, [-3, -200000, -25.0], 0.00089, 8],
[2, [-3, -200000, -25.0], 0.000899, 18]]
元素 [lst[i][1] for i in range(len(lst))] 应该是笛卡尔坐标,其中一些出现不止一次。
我想给每个坐标一个唯一的数字,这样列表就变成了:
lst = [[0, 0, 0.00001, 2],
[10, 1, 0.00011, 4],
[0, 2, 0.000009, 42],
[0, 3, 0.00801, 7],
[1, 2, 0.00089, 8],
[2, 2, 0.000899, 18]]
这意味着,如果坐标 [-3, -200000, -25.0] 曾经被数字替换(这里是 2),则该坐标的所有副本必须也被替换为相同的数字。
如果原始列表lst中的元素重新排列也可以,重点是我需要用数字替换所有坐标三元组。
提前谢谢你。
请您参考如下方法:
我们可以先构造一个defaultdict:
from collections import defaultdict
from itertools import count
dispatcher = defaultdict(lambda c=count(0): next(c))
现在我们可以简单地用查找替换。现在由于元素不可散列,我们不能简单地将它们添加到字典中。但是我们可以将它们转换成一个元组。
所以现在我们可以使用:
for lsti in lst:
lsti[1] = dispatcher[tuple(lsti[1])]
对于给定的输入,这会生成:
>>> lst
[[0, 0, 1e-05, 2], [10, 1, 0.00011, 4], [0, 2, 9e-06, 42], [0, 3, 0.00801, 7], [1, 2, 0.00089, 8], [2, 2, 0.000899, 18]]
