查找并替换Array中的重复项,但用不同的字符串替换每个第n个实例

Kin*_*Mak 2 python

我有一个数组,下面是重复的字符串.我想找到并替换这些字符串,但每次匹配时我都想更改替换字符串的值.

让我来证明一下.

此样本数组:

SampleArray = ['champ', 'king', 'king', 'mak', 'mak', 'mak']
Run Code Online (Sandbox Code Playgroud)

应该改为:

SampleArray = ['champ', 'king1', 'king2', 'mak1', 'mak2', 'mak3']
Run Code Online (Sandbox Code Playgroud)

如何使这成为可能?我已经在这3天了,没有运气.提前致谢.

My Failed Code:

import os, collections, re

SampleArray = ['champ', 'king', 'king', 'mak', 'mak', 'mak']
dupes = [x for x, y in collections.Counter(SampleArray).items() if y > 1]
length = len(dupes)
count = 0

while count < length:
    j = 0
    instances = SampleArray.count(dupes[count])
    while j < instances:
        re.sub(dupes[count],  dupes[count] + j, SampleArray, j)
        j += 1
    count += 1
print SampleArray    
print ''; os.system('pause')
Run Code Online (Sandbox Code Playgroud)

geo*_*org 5

我会使用collections.Counter:

from collections import Counter

numbers = { 
    word: iter([""] if count == 1 else xrange(1, count + 1)) 
    for word, count in Counter(sample).items()
}

result = [
    word + str(next(numbers[word])) 
    for word in sample
]
Run Code Online (Sandbox Code Playgroud)

这不要求以任何方式对列表进行排序或分组.

此解决方案使用迭代器生成序列号:

  • 首先,我们计算列表中每个单词出现的次数(Counter(sample)).

  • 然后我们创建一个字典numbers,对于每个单词,它包含它的"编号"迭代器iter(...).如果单词只出现一次count==1,则此迭代器将返回("yield")一个空字符串,否则它将产生范围从1到count的顺序数[""] if count == 1 else xrange(1, count + 1).

  • 最后,我们再次遍历列表,并且,对于每个单词,从其自己的编号迭代器中选择下一个值next(numbers[word]).由于我们的迭代器返回数字,我们必须将它们转换为字符串str(...).