x = [20, 6, 99, 3, 6, 2, 1,11,41, 31, 99, 6, 7, 8, 99, 10, 99 ,6]
y =[]
for j in x:
y[j]+=1
我想计算x中列表值的出现次数。当我尝试使用上面的代码时,我收到一个错误。有什么问题在我的代码中?
我是编程新手,所以请用简单的方式解释一下。
我想要的输出是一个列表,其中包含x
中值的出现次数。
答案 0 :(得分:3)
您应该使用字典而不是列表,并且还要小心 - 如果字典中不存在该值,则无法添加+1
,这就是您应该使用.get(j, 0)
的原因(如果是第一次出现的话,零将作为默认值返回):
x = [20, 6, 99, 3, 6, 2, 1,11,41, 31, 99, 6, 7, 8, 99, 10, 99 ,6]
y ={}
for j in x:
y[j] = y.get(j,0) + 1
print y # {1: 1, 2: 1, 3: 1, 6: 4, 7: 1, 8: 1, 41: 1, 10: 1, 11: 1, 99: 4, 20: 1, 31: 1}
答案 1 :(得分:0)
在您的代码中y
是一个列表。因此y[j]
为j=6
,例如,获取y
的第6个元素。相反,您要做的是将y
初始化为dict
,例如y={}
。
您的代码将变为:
y = {}
for j in x:
y[j] = y.get(j,0) + 1
Python 2.6+的甚至更好的方式是使用Counter
答案 2 :(得分:0)
您可以使用collection.counter函数。
>>> from collections import Counter
>>> x = [20, 6, 99, 3, 6, 2, 1,11,41, 31, 99, 6, 7, 8, 99, 10, 99 ,6]
>>> Counter(x)
Counter({99: 4, 6: 4, 1: 1, 2: 1, 7: 1, 8: 1, 41: 1, 10: 1, 11: 1, 3: 1, 20: 1, 31: 1})
>>> dict(Counter(x))
{1: 1, 2: 1, 99: 4, 6: 4, 7: 1, 8: 1, 41: 1, 10: 1, 11: 1, 3: 1, 20: 1, 31: 1}
答案 3 :(得分:0)
如果计算机不知道阵列的大小,则无法访问阵列的元素。想象一下,计算机认为你的数组y
长度为10,并为它留出一小块内存,并将其余的内存用于其他东西,如电脑游戏。现在假设x
中的一个数字是10000000000.那么计算机将不得不修改远离数组开头的单元格,这将是不好的,因为计算机已经将该内存用于其他事情,你没有事先警告过它。
在较低级别的语言中,比如C,你首先声明一个数组(为它预留内存),然后为其元素赋值。
在您的示例中,您的数组y
实际上长度为0,因此当您尝试访问其中的元素时,计算机可以理解为无法理解。
答案 4 :(得分:0)
馆藏中还有Counter。
from collections import Counter
x = [20, 6, 99, 3, 6, 2, 1, 11, 41, 31, 99, 6, 7, 8, 99, 10, 99, 6]
cnt = Counter(x)
输出的示例视图:
dict(cnt)
Out[113]: {1: 1, 2: 1, 3: 1, 6: 4, 7: 1, 8: 1, 10: 1, 11: 1, 20: 1, 31: 1, 41: 1, 99: 4}
list(cnt)
Out[114]: [1, 2, 3, 6, 7, 8, 41, 10, 11, 99, 20, 31]
list(cnt.viewitems())
Out[115]:
[(1, 1),
(2, 1),
(3, 1),
(6, 4),
(7, 1),
(8, 1),
(41, 1),
(10, 1),
(11, 1),
(99, 4),
(20, 1),
(31, 1)]