【问题标题】:python counting and appending to listpython计数并追加到列表
【发布时间】:2014-03-04 11:46:46
【问题描述】:

我正在尝试计算某事在列表中出现的次数。是否可以设置一个变量来移动每个索引并对其进行计数。我想在列表中附加每个计数器的次数。
我希望它看起来像这样。忘记while循环,这只是为了表明我正在循环这个。 例子。如果可能的话,可以导入一个库来创建一个快捷方式,或者如果它是唯一的方法。

while True:
    index = 0
    L = ["brown", "brown", "brown", "red", "red", "yellow", "yellow"]
    numberOfTimes = L.count([index]) 
    index = index + numberOfTimes 
    numberOfTimesList.append(numberOfTimes)

然后我想制作另一个列表,这样我就只能看到一次这样的棕色:

["brown", "red", "yellow"] [3, 2, 2]

【问题讨论】:

    标签: python


    【解决方案1】:

    使用collections.counter:

    from collections import Counter
    L = ["brown", "brown", "brown", "red", "red", "yellow", "yellow"]
    cnt = Counter(L)
    print cnt
    print cnt.keys(), cnt.values()
    

    输出:

    Counter({'brown': 3, 'yellow': 2, 'red': 2})
    ['brown', 'yellow', 'red'] [3, 2, 2]
    

    生成的计数器对象可以作为字典进行操作,并带有额外的方便例程,例如 cnt.most_common(n),它将返回 n 最常见的元素及其计数。

    【讨论】:

      【解决方案2】:

      您可以轻松做到这一点:

      [1, 2, 3, 4, 1, 4, 1].count(1)
      

      上面的代码计算了数字1在列表中出现的次数。你可以对你的列表做同样的事情。

      在你的情况下这样做。

      for thing in L:
        # Count variable represents the number of times the thing variable was found
        count = L.count(thing)
      

      【讨论】:

      • count 在您想计算一件事的出现时很好,但是当您想计算所有项目时,与collections.Counter 的线性性能相比,它会遭受二次运行时间。跨度>
      • @user2357112 这是真的。
      【解决方案3】:

      Python基础:

      首先,Pythonic 循环或迭代的方式是:

      In [5]: L = ["brown", "brown", "brown", "red", "red", "yellow", "yellow"]
      
      In [6]: for i in L:
         ...:     print i
         ...:     
      brown
      brown
      brown
      red
      red
      yellow
      yellow
      

      其次,统计出现次数,Python 中最基本最强大的工具:dict 会有所帮助。

      In [8]: counts = {}
      
      In [9]: for i in L:
         ...:     counts[i] = (counts[i] + 1) if (i in counts) else 1
         ...:     
      
      In [10]: counts
      Out[10]: {'brown': 3, 'red': 2, 'yellow': 2}
      
      In [11]: counts.keys()
      Out[11]: ['brown', 'yellow', 'red']
      
      In [12]: counts.values()
      Out[12]: [3, 2, 2]
      

      @YS-L 所说的使用collections.Counter 对你的问题更有说服力,但我认为在使用更高级别的工具之前熟悉 Python 的基础会更好

      【讨论】:

      • 不要用and/or模拟conditional expressionsand/or hack 容易出错且不必要。
      • 更进一步的是使用counts = collections.defaultdict(int),然后将所有内容委托给collections.Counter
      • @user2357112 谢谢!答案更正。我知道and/or 很容易出错,比如什么时候应该返回0 为真,1 为假。但我根本不知道Conditional Expressions :(
      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 2013-04-16
      • 2021-01-09
      • 1970-01-01
      • 2013-11-08
      • 2020-08-08
      • 2021-01-10
      • 2020-05-05
      相关资源
      最近更新 更多