Skip to main content
 首页 » 编程设计

python之为列表中的重复元素添加空格

2025年05月04日18powertoolsteam

我有以下列表 1:

['Tom', 'Michael', 'Tom', 'Tom'] 

我想在重复值中添加一个空格以获得以下输出:

['Tom', 'Michael', 'Tom ', 'Tom  '] 

由于 Tom 重复了 2 次,第一次它有 I 空格,第二个有 2 个空格在末尾

我喜欢使用这样一行代码

[ f'{x} ' for x in list1 if .... ] 

但不太确定如何将它应用到我的案例中

这是我到目前为止尝试过的:

from collections import Counter 
d =  Counter(list1)  
res = [k for k, v in d.items() if v > 1] 
print([ f'{x} ' for x in res ]) 

是否有更有效的方法来做到这一点,包括添加空格?

请您参考如下方法:

因为你想在每个元素之前添加空格作为出现次数,你可以使用 count list 的方法。然后将此计数与 "" 相乘:

l = ['Tom', 'Michael', 'Tom', 'Tom'] 
 
res = [] 
for i in range(len(l)): 
    cnt = l[:i].count(l[i]) 
    res.append(l[i] + " "*cnt) 

或者在一行中:

res = [l[i] + " " * l[:i].count(l[i]) for i in range(len(l))] 

并且都按预期给出:

['Tom', 'Michael', 'Tom ', 'Tom  '] 

另一种不同的方法是使用 defaultdict并“记住”一次性计数 (O(n)),而不是为每个元素计数 (O(n^2) ):

from collections import defaultdict 
 
l = ['Tom', 'Michael', 'Tom', 'Tom'] 
 
res = [] 
d = defaultdict(int) 
for x in l: 
    cnt = d[x] 
    res.append(x + " "*cnt) 
    d[x] = cnt + 1 

这样,如果第一次看到一个元素,它的计数将初始化为 0。


或者,最后,没有任何导入。我们可以只使用常规字典并利用 setdefault方法:

l = ['Tom', 'Michael', 'Tom', 'Tom'] 
 
res = [] 
d = {} 
for x in l: 
    res.append(x + " "*d.setdefault(x, 0)) 
    d[x] += 1