在Python中计算同一项中出现的次数

3
抱歉,我相信可能已经有其他人问过这个问题了,但我没有找到。我想追踪我看到这个特定项目的次数,例如:
输入:
[88,88,27,0,88]

期望的输出:

[1,2,1,1,3]

我正在寻找在性能方面尤为出色的解决方案。Numpy或Pandas的解决方案都可以。


1
你为什么想要这个输出? - user3483203
请查看此链接:https://dev59.com/83E85IYBdhLWcg3wzm5p - Kyrylo
期望输出的第一项意味着这是我第一次看到“8”。 - hans glick
4个回答

3

以下是使用列表推导式的简单方法:

x = [8,1,2,3,1,3,3,1,2,99]
y = [x[:i].count(el) + 1 for i, el in enumerate(x)]
print(y)

输出:

[1, 1, 1, 1, 2, 2, 3, 3, 2, 1]

这个问题可以通过单次遍历解决,无需切片,也不需要重复计数。 - G_M
1
谢谢您的回答,但这似乎非常昂贵。 - hans glick
我同意你的观点,这主要取决于你所处理的输入大小。 - user3483203

2
lst = [8,1,2,3,1,3,3,1,2,99]

cnt = {}
res = []

for x in lst:
    cnt[x] = cnt.get(x,0)+1
    res += [cnt[x]]

print(res)

输出


谢谢您的回答。您知道有没有使用Numpy的实现吗? - hans glick

1
>>> from collections import defaultdict
... 
... 
... def solution(lst):
...     result = []
...     seen = defaultdict(int)
...     for num in lst:
...         seen[num] += 1
...         result.append(seen[num])
...     return result
... 
>>> solution([88, 88, 27, 0, 88])
[1, 2, 1, 1, 3]
>>> solution([8, 1, 2, 3, 1, 3, 3, 1, 2, 99])
[1, 1, 1, 1, 2, 2, 3, 3, 2, 1]

没有导入:

>>> def solution(lst):
...     result = []
...     seen = {}
...     for num in lst:
...         try:
...             seen[num] += 1
...         except KeyError:
...             seen[num] = 1
...         result.append(seen[num])
...     return result
... 
>>> solution([88, 88, 27, 0, 88])
[1, 2, 1, 1, 3]
>>> solution([8, 1, 2, 3, 1, 3, 3, 1, 2, 99])
[1, 1, 1, 1, 2, 2, 3, 3, 2, 1]

谢谢您的回答,但我更倾向于不导入这个集合库。 - hans glick

1

使用生成器的一个例子:

def return_count(l):
    cnt = {}
    for x in l:
        cnt[x] = cnt.get(x, 0) + 1
        yield cnt[x]

print(list(return_count([8, 1, 2, 3, 1, 3, 3, 1, 2, 99])))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接