鉴于此字符串列表:
list=['foo','foo','foo','bar','bar','baz','baz','baz']
我想得到一个相应数字的列表,好像这是一个像这样的并列排名的索引:
numbers=[0,0,0,1,1,2,2,2]
提前致谢!
答案 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))