www说
您有不唯一的标签;您可以使用defaultdict来在首次访问时结合计数器生成数字:from collections import defaultdictfrom itertools import countfrom functools import partiallabel_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两次。两种方法都不需要您先定义标签字典;映射是自动创建的。
ITMISS
尝试这个: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,以此类推。