使用
defaultdict,并使用计数器作为默认值函数。
每当键存在时,它返回存储的“第一个遇到的位置”,否则调用
Incr.__call__
,该函数增加其计数以提供新的第一个遇到的位置。
根据超级大脑的建议,使用现有的计数器类:
from collections import defaultdict
from itertools import count
li = ['pea', 'rpai', 'rpai', 'schiai', 'pea', 'rpe', 'zoi', 'zoi', 'briai', 'rpe']
seen = defaultdict(count().__next__)
print( [seen[val] for val in li] )
像之前一样,自己编写Incr函数也有好处,这样你可以返回任何东西(例如GUID):
from collections import defaultdict
class Incr:
def __init__(self):
self.count = -1
def __call__(self):
self.count +=1
return self.count
li = ['pea', 'rpai', 'rpai', 'schiai', 'pea', 'rpe', 'zoi', 'zoi', 'briai', 'rpe']
seen = defaultdict(Incr())
print( [seen[val] for val in li] )
两者提供相同的输出:
[0, 1, 1, 2, 0, 3, 4, 4, 5, 3]
count
和count2
应该是什么以及为什么它们有不同的类型。你能用普通语言告诉我们吗?没有条件可以区分重复和非重复元素,因此预计这段代码不起作用。另外,请提供一个 [mcve],其中包含所有的代码和示例数据。最后,作为一个新用户,在这里参加 [tour] 并阅读 [ask]。 - Ulrich Eckhardt