Python:将字符串“键”列表枚举为整数

我搜索了一段时间,但没有找到任何能确切解释我正在尝试做的事情。

基本上,我有一个字符串“标签”的列表,例如[“棕色”,“黑色”,“蓝色”,“棕色”,“棕色”,“黑色”]等。我要做的就是将其转换为列表整数,每个标签对应一个整数,所以

["brown", "black", "blue", "brown", "brown", "black"]

变成

[1, 2, 3, 1, 1, 2]

我查看了枚举函数,但是当我给它我的字符串列表(很长)时,它为每个单独的标签分配了一个int,而不是给同一标签相同的int:

[(1,"brown"),(2,"black"),(3,"blue"),(4,"brown"),(5,"brown"),(6,"black")]

我知道如何通过冗长且繁琐的for循环和if-else检查来做到这一点,但我真的很好奇是否有一种更优雅的方法可以仅在一行或两行中执行此操作。


料青山看我应如是
浏览 208回答 3
3回答

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两次。两种方法都不需要您先定义标签字典;映射是自动创建的。

汪汪一只猫

您可以先创建一个字典,例如:dict = {"brown":1 , "black": 2, "blue": 3 }进而:li = ["brown", "black", "blue", "brown", "brown", "black"][dict[i] for i in li]

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,以此类推。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python