在Python2中将不连续值转换为连续值

在Python2中将不连续值转换为连续值,python,Python,假设我有一个列表: 5100505020 (有4个不同的数字) 我想将它们转换为: 011232 (然后转换回原始形式) 有很多种方法可以做到这一点,但我不确定什么是最好的和蟒蛇式的方法 (一种方法是生成一个集合,将集合转换为一个列表,对列表进行排序,然后根据排序后的列表生成输出,但我认为这不是最好的方法)我认为这是一个很好的利用和方法的问题 我认为这是一个很好的利用和方法的问题 Delgan建议的答案是O(n^2),因为back中有嵌套循环。这个解是O(n) 另一种解决方案如下: lst =

假设我有一个列表:

5100505020

(有4个不同的数字)

我想将它们转换为:

011232

(然后转换回原始形式)

有很多种方法可以做到这一点,但我不确定什么是最好的和蟒蛇式的方法


(一种方法是生成一个集合,将集合转换为一个列表,对列表进行排序,然后根据排序后的列表生成输出,但我认为这不是最好的方法)

我认为这是一个很好的利用和方法的问题


我认为这是一个很好的利用和方法的问题


Delgan建议的答案是O(n^2),因为
back
中有嵌套循环。这个解是O(n)

另一种解决方案如下:

lst = [5, 10, 10, 20, 50, 50, 20]

# Convert (and build reverse mapping)
mapping = {}
reverse_mapping = {}
conv = []
for i in lst:
    v = mapping.setdefault(i, len(mapping))
    reverse_mapping[v] = i
    conv.append(v)

# Convert back
back = [reverse_mapping[v] for v in conv]

Delgan建议的答案是O(n^2),因为
back
中有嵌套循环。这个解是O(n)

另一种解决方案如下:

lst = [5, 10, 10, 20, 50, 50, 20]

# Convert (and build reverse mapping)
mapping = {}
reverse_mapping = {}
conv = []
for i in lst:
    v = mapping.setdefault(i, len(mapping))
    reverse_mapping[v] = i
    conv.append(v)

# Convert back
back = [reverse_mapping[v] for v in conv]

听起来像是个X-Y问题。你为什么要这么做?也许有更好的方法。我有一个像上面这样的数据,我需要将它转换成
0..n
来进一步处理。一个使用逻辑的简单函数可以工作。需要尽快吗?听起来像是X-Y问题。你为什么要这么做?也许有更好的方法。我有一个像上面这样的数据,我需要将它转换成
0..n
来进一步处理。一个使用逻辑的简单函数可以工作。它需要尽可能快吗?