【问题标题】:counting the number of values in a python list [duplicate]计算python列表中值的数量[重复]
【发布时间】:2015-05-14 04:41:29
【问题描述】:
 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 中值的出现次数。

【问题讨论】:

  • y 中没有元素时,y[0] 应该是什么意思?
  • 你应该使用字典来实现这个
  • 不。它没有任何意义。
  • collections.Counter 上的许多问题重复,请参阅unutbu's answer to How to count the frequency of the elements in a list?
  • @IgnacioVazquez-Abrams 好的,这就是我出错的原因。好的,现在我明白了。一个简单的概念。

标签: python


【解决方案1】:

您应该使用字典而不是列表,并且还要小​​心 - 如果字典中不存在该值,则不能添加 +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}

【讨论】:

    【解决方案2】:

    你可以使用 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】:

      如果计算机不知道数组的大小,您就不能只访问数组的元素。想象一下,计算机认为您的数组y 的长度为 10,并为它留出一小块内存,并将剩余的内存用于其他东西,比如电脑游戏。现在想象x 中的一个数字是 10000000000。然后计算机将不得不修改一个远离数组开头的单元格,这很糟糕,因为计算机已经将该内存用于其他内容,而且你没有提前警告。

      在低级语言(如 C)中,您可以更明确地执行此操作,首先声明一个数组(为其留出内存),然后为其元素分配值。

      在您的示例中,您的数组 y 实际上的长度为 0,因此当您尝试访问其中的元素时,计算机会停止,这是可以理解的。

      【讨论】:

        【解决方案4】:

        集合中还有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)]
        

        【讨论】:

          【解决方案5】:

          在您的代码中,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

          【讨论】:

            猜你喜欢
            • 2016-03-04
            • 2012-09-05
            • 2018-02-17
            • 1970-01-01
            • 2018-06-17
            • 2019-02-04
            • 1970-01-01
            • 2018-09-04
            • 1970-01-01
            相关资源
            最近更新 更多