首页 > 解决方案 > 将列表中的重复项转换为唯一项

问题描述

我在列表中有以下重复项目列表:

x = ['John', "Jill", "Ron", "John", "Jill", "John", "Tom", "Harry", "Harry"]

我想得到以下输出:

out = ['John_1', "Jill_1", "Ron_1", "John_2", "Jill_2", "John_3", "Tom_1", "Harry_1", "Harry_2"]

我写了以下代码:

from collections import Counter
def iterate_string_duplicates(x):
    nl = []
    dct = dict(Counter(x))
    for k,v in dct.items():
        for i in list(range(1,v+1)):
            nl.append(k+"_"+str(i))
    return nl

但是由于使用了字典方法,我得到了以下输出:

iterate_string_duplicates(x)
output: ['John_1', 'John_2', 'John_3', 'Jill_1', 'Jill_2', 'Ron_1', 'Tom_1', 'Harry_1', 'Harry_2']

我正在寻找一种初始字符串的顺序不会改变的方法。

标签: pythonarrayslist

解决方案


您可以使用的列表理解想法是将计数器与每个名称相关联。然后它只需要一次通过迭代。

>>> from collections import defaultdict
>>> from itertools import count
>>> suffix = defaultdict(lambda: count(1))
>>> x = ['John', "Jill", "Ron", "John", "Jill", "John", "Tom", "Harry", "Harry"]
>>> [f"{name}_{next(suffix[name])}" for name in x]
['John_1',
 'Jill_1',
 'Ron_1',
 'John_2',
 'Jill_2',
 'John_3',
 'Tom_1',
 'Harry_1',
 'Harry_2']

推荐阅读