2 回答

TA貢獻1796條經驗 獲得超4個贊
您可以使用字典:
label_list = [['AH0'], ['AA1', 'K', 'S'], ['AH0', 'N', 'T'], ['AA1', 'K', 'S'], ['IH0', 'N'], ['AA1', 'K', 'S']]
count = 0
d = {}
for i in label_list:
if tuple(i) not in d:
d[tuple(i)] = count
count += 1
final_result = [d[tuple(i)] for i in label_list]
輸出:
[0, 1, 2, 1, 4, 1]
編輯:上面的解決方案假定標簽是根據唯一值的首次出現的索引生成的。但是,如果需要一般的增量,并且要根據看到的唯一元素的數量創建標簽,則count可以在for循環內移動它:
if tuple(i) not in d:
d[tuple(i)] = count
count += 1
然后,輸出為[0, 1, 2, 1, 3, 1]。
列表理解也可以使用,盡管效率不高:
c = iter(range(len(label_list)))
new_d = {tuple(a):i for i, a in reversed(list(enumerate(label_list)))}
final_result = [next(c) if a not in label_list[:i] else new_d[tuple(a)] for i, a in enumerate(label_list)]
輸出:
[0, 1, 2, 1, 3, 1]

TA貢獻1827條經驗 獲得超9個贊
這是一個單線,只是為了好玩:
[dict( map( reversed, enumerate( set( map(tuple, label_list)))))[tuple(item)] for item in label_list]
不利的一面(除了難以理解之外)是,它創建字典的次數與label_list中項目的次數相同。
要解釋它是如何工作的,請從內而外閱讀它:
map(tuple, label_list)
將tuple函數應用(或“映射”)元組函數到label_list的每個元素,以便以后每個元素都可以用作字典中的鍵(python列表不能是字典鍵)
set( map(tuple, label_list))
在label_list中創建一組所有唯一元素,這是我們需要的,因為您希望每個唯一條目都具有唯一標簽
enumerate( set( map(tuple, label_list)))
枚舉是一個將某些列表作為輸入并為列表的每個元素返回唯一(按順序)整數的函數。因此,您得到的是這樣的元組列表[[0,element_0),(1,element_1)...]
map( reversed, enumerate( set( map(tuple, label_list))))
這會顛倒上面列表中的元素,因此當我們在下一步中創建字典時,元素將是鍵而不是整數。因此我們得到[[element_0,0),(element_1,0)...]
dict( map( reversed, enumerate( set( map(tuple, label_list)))))
只需獲取上一步中的元組列表并從中創建一個字典,就可以像訪問其他任何字典一樣使用它們的鍵(即使用dictionary[element]
語法)。
該行的其余部分與其他任何列表理解一樣。它遍歷您的原始label_list并訪問我們創建的字典以獲得與每個元素關聯的唯一編號。
添加回答
舉報