查找并替换Array中的重复项,但将每个nth实例替换为不同的字符串

我下面有一个数组,其中包含重复的字符串。我想查找并替换那些字符串,但是每次匹配时,我都想更改替换字符串的值。


让我示范一下。


此样本数组:


SampleArray = ['champ', 'king', 'king', 'mak', 'mak', 'mak']

应该更改为:


SampleArray = ['champ', 'king1', 'king2', 'mak1', 'mak2', 'mak3']

如何做到这一点?我已经走了三天了,没有运气。提前致谢。


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')


小唯快跑啊
浏览 178回答 2
2回答

www说

我会使用collections.Counter:from collections import Counternumbers = {&nbsp;&nbsp; &nbsp; word: iter([""] if count == 1 else xrange(1, count + 1))&nbsp;&nbsp; &nbsp; for word, count in Counter(sample).items()}result = [&nbsp; &nbsp; word + str(next(numbers[word]))&nbsp;&nbsp; &nbsp; for word in sample]这不需要以任何方式对列表进行排序或分组。此解决方案使用迭代器生成序列号:首先,我们计算每个单词在列表(Counter(sample))中出现的次数。然后我们创建一个字典numbers,其中每个单词都包含其“编号”迭代器iter(...)。如果单词仅出现一次count==1,则此迭代器将返回(“产生”)一个空字符串,否则它将产生从1到count范围内的连续数字[""] if count == 1 else xrange(1, count + 1)。最后,我们再次遍历该列表,并针对每个单词从其自己的编号迭代器中选择下一个值next(numbers[word])。由于迭代器返回数字,因此我们必须将其转换为字符串str(...)。

月关宝盒

groupby 是对重复项进行分组的便捷方法:>>> from itertools import groupby>>> FinalArray = []>>> for k, g in groupby(SampleArray):&nbsp; &nbsp; # g is an iterator, so get a list of it for further handling&nbsp; &nbsp; items = list(g)&nbsp; &nbsp; # If only one item, add it unchanged&nbsp; &nbsp; if len(items) == 1:&nbsp; &nbsp; &nbsp; &nbsp; FinalArray.append(k)&nbsp; &nbsp; # Else add index at the end&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; FinalArray.extend([j + str(i) for i, j in enumerate(items, 1)])>>> FinalArray['champ', 'king1', 'king2', 'mak1', 'mak2', 'mak3']
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python