Python将列表中的字符串转换为基于订单的整数

时间:2016-06-21 22:26:56

标签: list python-3.x

鉴于此字符串列表:

list=['foo','foo','foo','bar','bar','baz','baz','baz']

我想得到一个相应数字的列表,好像这是一个像这样的并列排名的索引:

numbers=[0,0,0,1,1,2,2,2]

提前致谢!

1 个答案:

答案 0 :(得分:1)

假设字符串已经分组(所有重复的字符串都是连续的),执行此操作的最低开销方式是使用itertools.groupby

from itertools import groupby

numbers = [i for i, (_, g) in enumerate(groupby(mylist)) for _ in g]

这只是对mylist中的条目进行分组(list是变量的可怕名称,遮蔽list构造函数),并生成i(0-up)到目前为止看到的组的数量)对于组中的每个条目一次(我们甚至不关心值是什么,因此for _ in g表示_不重要)。

如果重复的值可能不是连续的,但应该具有相同的组号(即['d', 'f', 'd']可能会发生,并且应该生成[0, 1, 0]而不是[0, 1, 2]),那么'' d使用不同的方法(这也适用于连续的情况,但需要groupby方法避免的持久和不断增长的状态:

from collections import defaultdict
from itertools import count

# If key seen already, returns value, otherwise, returns next unused integer group number
grouptracker = defaultdict(count().__next__)  # .next on Py2

numbers = [grouptracker[x] for x in mylist]

或者为了有趣和难以理解而对其进行单行处理(实际上并不这样做):

numbers = list(map(defaultdict(count().__next__).__getitem__, mylist))