我有以下列表 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
