3 回答

TA貢獻1775條經驗 獲得超8個贊
您有不唯一的標簽;您可以使用defaultdict來在首次訪問時結合計數器生成數字:
from collections import defaultdict
from itertools import count
from functools import partial
label_to_number = defaultdict(partial(next, count(1)))
[(label_to_number[label], label) for label in labels]
這會按照標簽中第一個出現的順序生成一個計數labels。
演示:
>>> labels = ["brown", "black", "blue", "brown", "brown", "black"]
>>> label_to_number = defaultdict(partial(next, count(1)))
>>> [(label_to_number[label], label) for label in labels]
[(1, 'brown'), (2, 'black'), (3, 'blue'), (1, 'brown'), (1, 'brown'), (2, 'black')]
因為我們使用的是字典,所以標簽到數字的查找成本是恒定的,因此整個操作將基于labels列表的長度花費線性時間。
或者,使用aset()獲取唯一值,然后將它們映射到一個enumerate()計數:
label_to_number = {label: i for i, label in enumerate(set(labels), 1)}
[(label_to_number[label], label) for label in labels]
由于set()對象沒有排序,因此可以更隨意地分配數字:
>>> label_to_number = {label: i for i, label in enumerate(set(labels), 1)}
>>> [(label_to_number[label], label) for label in labels]
[(2, 'brown'), (3, 'black'), (1, 'blue'), (2, 'brown'), (2, 'brown'), (3, 'black')]
但是,這需要循環labels兩次。
兩種方法都不需要您先定義標簽字典;映射是自動創建的。

TA貢獻1898條經驗 獲得超8個贊
您可以先創建一個字典,例如:
dict = {"brown":1 , "black": 2, "blue": 3 }
進而:
li = ["brown", "black", "blue", "brown", "brown", "black"]
[dict[i] for i in li]

TA貢獻1871條經驗 獲得超8個贊
嘗試這個:
lst = ["brown", "black", "blue", "brown", "brown", "black"]
d = {"brown":1, "black":2, "blue":3}
[d[k] for k in lst]
=> [1, 2, 3, 1, 1, 2]
當然,要使其正常工作,您必須在某處定義等效項-上面,我為此使用了字典。否則,無法知道棕色對應于數字1,以此類推。
添加回答
舉報