为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

料青山看我应如是 2021-03-30 12:19:18
我搜索了一段时间,但没有找到任何能确切解释我正在尝试做的事情。基本上,我有一个字符串“标签”的列表,例如[“棕色”,“黑色”,“蓝色”,“棕色”,“棕色”,“黑色”]等。我要做的就是将其转换为列表整数,每个标签对应一个整数,所以["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检查来做到这一点,但我真的很好奇是否有一种更优雅的方法可以仅在一行或两行中执行此操作。
查看完整描述

3 回答

?
www说

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两次。


两种方法都不需要您先定义标签字典;映射是自动创建的。


查看完整回答
反对 回复 2021-04-02
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

您可以先创建一个字典,例如:


dict = {"brown":1 , "black": 2, "blue": 3 }

进而:


li = ["brown", "black", "blue", "brown", "brown", "black"]

[dict[i] for i in li]


查看完整回答
反对 回复 2021-04-02
?
ITMISS

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,以此类推。


查看完整回答
反对 回复 2021-04-02
  • 3 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号