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并访问我们创建的字典以获得与每个元素关联的唯一编号。
添加回答
举报