不使用 Counter 对列表中的元素进行计数

Count elements in a list without using Counter

应该返回以下格式的字典:

key_count([1, 3, 2, 1, 5, 3, 5, 1, 4]) ⇒ {
    1: 3,
    2: 1,
    3: 2,
    4: 1,
    5: 2,
}

我知道最快的方法如下:

import collections

def key_count(l):
    return collections.Counter(l)

但是,我想在不导入的情况下执行此操作 collections.Counter

到目前为止我有:

x = []
def key_count(l):
    for i in l:
        if i not in x:
            x.append(i)
            
    count = []
    for i in l:
        if i == i:
            

我通过尝试将字典的两侧(键和值)提取到单独的列表中然后使用 zip 创建字典来解决这个问题。如您所见,我能够提取最终字典的键,但我无法弄清楚如何将原始列表中每个数字的出现次数添加到新列表中。我想创建一个空列表计数,它最终将是一个数字列表,表示原始列表中每个数字出现的次数。有小费吗?在我试图解决这个问题时,希望不要给出完整的答案!提前致谢

当您可以直接构建 dict 时,分离键和值需要付出很多努力。这是算法。我会把实现留给你,虽然它有点实现自己。

  1. 空字典
  2. 遍历列表
  3. 如果该元素不在字典中,则将值设置为 1。否则,添加到现有值。

在此处查看实现:

使用字典对键和值进行配对,并使用您的 x[] 来跟踪创建的不同项目。

import collections

def keycount(l):
    return collections.Counter(l)

key_count=[1, 3, 2, 1, 5, 3, 5, 1, 4]
x = []
dictionary ={}

def Collection_count(l):
    for i in l:
        if i not in x:
            x.append(i)
            dictionary[i]=1
        else:
            dictionary[i]=dictionary[i]+1

Collection_count(key_count)
[print(key, value) for (key, value) in sorted(dictionary.items())]

经典的reduce问题。使用循环:

a = [1, 3, 2, 1, 5, 3, 5, 1, 4]
m = {}

for n in a:
   if n in m: m[n] += 1
   else: m[n] = 1

print(m)

或显式减少:

from functools import reduce
a = [1, 3, 2, 1, 5, 3, 5, 1, 4]

def f(m, n):
   if n in m: m[n] += 1
   else: m[n] = 1
   return m

m2 = reduce(f, a, {})
print(m2)