首页 > 解决方案 > 为列表中的重复元素添加空格

问题描述

我有以下列表1:

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

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

['Tom', 'Michael', '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 ])

有没有更有效的方法来做到这一点,包括添加空间?

标签: pythonlistlist-comprehension

解决方案


因为要添加空格作为每个元素的出现次数,所以可以使用count列表方法。然后将此计数乘以" "

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

推荐阅读