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,以此类推。
添加回答
举报