2016-05-17 38 views
0

比方說,我有一個列表:轉換(反面)不連續的值,以連續的值在Python 2

5 10 10 20 50 50 20

(有4區分數字)。

我想將它們轉換爲:

0 1 1 2 3 3 2

(再轉換回原來的形式)。

有很多方法可以做到這一點,但我不確定什麼是最好的和Pythonic的方式?

(一個方法是生成一組,一組轉換到一個列表,列表排序,然後生成的排序列表輸出,但我認爲這不是最好的之一)

+0

聽起來像是一個X-Y的問題。你爲什麼需要這樣做?也許有更好的方法。 –

+0

我有一個類似上面的數據,我需要將其轉換爲「0..n''來進一步處理。 –

+0

使用邏輯的簡單函數可以工作。它是否需要儘可能快? – Demandooda

回答

1

由於back中的嵌套循環,Delgan的建議答案是O(n^2)。這個解決方案是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] 
3

我認爲這是使用collections.defaultdict()itertools.count()方法是一個很好的問題。

from itertools import count 
from collections import defaultdict 

c = count() 
dct = defaultdict(lambda: next(c)) 

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

conv = [dct[i] for i in lst] 
# [0, 1, 1, 2, 3, 3, 2] 

back = [k for c in conv for k, v in dct.items() if v == c] 
# [5, 10, 10, 20, 50, 50, 20]