比方說,我有一個列表:轉換(反面)不連續的值,以連續的值在Python 2
5 10 10 20 50 50 20
(有4區分數字)。
我想將它們轉換爲:
0 1 1 2 3 3 2
(再轉換回原來的形式)。
有很多方法可以做到這一點,但我不確定什麼是最好的和Pythonic的方式?
(一個方法是生成一組,一組轉換到一個列表,列表排序,然後生成的排序列表輸出,但我認爲這不是最好的之一)
比方說,我有一個列表:轉換(反面)不連續的值,以連續的值在Python 2
5 10 10 20 50 50 20
(有4區分數字)。
我想將它們轉換爲:
0 1 1 2 3 3 2
(再轉換回原來的形式)。
有很多方法可以做到這一點,但我不確定什麼是最好的和Pythonic的方式?
(一個方法是生成一組,一組轉換到一個列表,列表排序,然後生成的排序列表輸出,但我認爲這不是最好的之一)
由於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]
我認爲這是使用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]
聽起來像是一個X-Y的問題。你爲什麼需要這樣做?也許有更好的方法。 –
我有一個類似上面的數據,我需要將其轉換爲「0..n''來進一步處理。 –
使用邏輯的簡單函數可以工作。它是否需要儘可能快? – Demandooda