我有一个数组,下面是重复的字符串.我想找到并替换这些字符串,但每次匹配时我都想更改替换字符串的值.
让我来证明一下.
此样本数组:
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)
我会使用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(...).