如何为lis中的每个唯一值添加计数

2024-05-16 10:03:09 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个清单。在

temp = ['A', 'B', 'A', 'B', 'A', 'B']

我在找一种方法来加入里面的细绳计数。在

预期输出:

^{pr2}$

我可以通过使用列表理解来解决它,但是我正在寻找一种不必指定列表[1, 1, 2, 2, 3, 3]的方法。有可能吗?在

[j + "_" + str(i) for i, j in zip([1, 1, 2, 2, 3, 3], temp)]

Tags: 方法in列表forziptemp计数str
3条回答

您可以使用字典(或者更好的是,^{})来维护每个项目的计数:

from collections import defaultdict

lst = ['A', 'B', 'A', 'B', 'A', 'B']
lst2 = []
d = defaultdict(int)

for item in lst:
    d[item] += 1
    lst2.append('{}_{}'.format(item, d[item]))

print(lst2)  # ['A_1', 'B_1', 'A_2', 'B_2', 'A_3', 'B_3']

要在这里使用列表理解,您需要某种方法在迭代原始列表时更新每个项的状态(即计数器)。为此,您可以使用带默认参数的函数,例如:

^{pr2}$

您可以将^{}for循环一起使用:

from collections import defaultdict

L = ['A', 'B', 'A', 'B', 'A', 'B']

dd = defaultdict(int)

res = []
for item in L:
    dd[item] += 1
    res.append(f'{item}_{dd[item]}')

print(res)

['A_1', 'B_1', 'A_2', 'B_2', 'A_3', 'B_3']

您可以使用Counterdefaultdict(int)来跟踪一个字符在遇到它们时被看到的次数。在

>>> from collections import Counter
>>> 
>>> temp = ['A', 'B', 'A', 'B', 'A', 'B']
>>> seen = Counter()
>>> 
>>> result = []
>>> for c in temp:
...:    seen.update(c)
...:    result.append('{}_{}'.format(c, seen[c]))
...:    
>>> result
>>> ['A_1', 'B_1', 'A_2', 'B_2', 'A_3', 'B_3']

请注意,seen.update(c)可能会有意外的结果,如果您希望temp中有多个字符。演示:

^{pr2}$

根据您希望如何计数以及您期望的数据类型,您可能希望使用该行

seen[c] += 1

而不是

seen.update(c)

或者,在不进口的情况下:

>>> seen = {}
>>> result = []
>>> 
>>> for c in temp:
...:    seen[c] = seen.get(c, 0) + 1
...:    result.append('{}_{}'.format(c, seen[c]))
...:    
>>> result
>>> ['A_1', 'B_1', 'A_2', 'B_2', 'A_3', 'B_3']

相关问题 更多 >