2 回答
TA贡献1775条经验 获得超8个赞
我会使用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
]
这不需要以任何方式对列表进行排序或分组。
此解决方案使用迭代器生成序列号:
首先,我们计算每个单词在列表(
Counter(sample)
)中出现的次数。然后我们创建一个字典
numbers
,其中每个单词都包含其“编号”迭代器iter(...)
。如果单词仅出现一次count==1
,则此迭代器将返回(“产生”)一个空字符串,否则它将产生从1到count范围内的连续数字[""] if count == 1 else xrange(1, count + 1)
。最后,我们再次遍历该列表,并针对每个单词从其自己的编号迭代器中选择下一个值
next(numbers[word])
。由于迭代器返回数字,因此我们必须将其转换为字符串str(...)
。
TA贡献1772条经验 获得超5个赞
groupby 是对重复项进行分组的便捷方法:
>>> from itertools import groupby
>>> FinalArray = []
>>> for k, g in groupby(SampleArray):
# g is an iterator, so get a list of it for further handling
items = list(g)
# If only one item, add it unchanged
if len(items) == 1:
FinalArray.append(k)
# Else add index at the end
else:
FinalArray.extend([j + str(i) for i, j in enumerate(items, 1)])
>>> FinalArray
['champ', 'king1', 'king2', 'mak1', 'mak2', 'mak3']
添加回答
举报