Skip to main content
 首页 » 编程设计

python用唯一数字替换列表中的元素

2025年05月04日25grandyang

我遇到了一些我找不到解决方案的问题。

我有一个看起来像他的列表,实际上有 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]]