【问题标题】:Update Counter collection in python with string, not letter用字符串而不是字母更新python中的计数器集合
【发布时间】:2018-01-02 14:13:31
【问题描述】:

如何用字符串而不是字符串的字母来更新计数器? 例如,在用两个字符串初始化这个计数器之后:

from collections import Counter
c = Counter(['black','blue'])

“添加”另一个字符串,例如“红色”。当我使用 update() 方法时,它会添加字母 'r'、'e'、'd':

c.update('red')
c
>>Counter({'black': 1, 'blue': 1, 'd': 1, 'e': 1, 'r': 1})

【问题讨论】:

    标签: python collections counter


    【解决方案1】:

    您可以使用字典更新它,因为添加另一个字符串与使用 count +1 更新键相同:

    from collections import Counter
    c = Counter(['black','blue'])
    
    c.update({"red": 1})  
    
    c
    # Counter({'black': 1, 'blue': 1, 'red': 1})
    

    如果key已经存在,则计数加一:

    c.update({"red": 1})
    
    c
    # Counter({'black': 1, 'blue': 1, 'red': 2})
    

    【讨论】:

    • 所以没有 c.increment("red") 或类似的东西?这对于基本操作来说似乎有点笨拙,尽管它确实有效。
    • @demongolem c["red"] += 1
    【解决方案2】:
    c.update(['red'])
    >>> c
    Counter({'black': 1, 'blue': 1, 'red': 1})
    

    Source 可以是可迭代的、字典或另一个 Counter 实例。

    虽然字符串是可迭代的,但结果不是你所期望的。首先将其转换为列表、元组等。

    【讨论】:

      【解决方案3】:

      你可以使用:

      c["red"]+=1
      # or
      c.update({"red": 1})
      # or 
      c.update(["red"])
      

      无论密钥是否存在,所有这些选项都将起作用。如果存在,它们会将计数增加 1

      【讨论】:

      • 对于那些需要性能的人来说,第一个是最快的,通过在 IPython/Jupyter 中使用 %timeit,包括计数器实例化 1. 5.77 µs ± 68.9 ns 每个循环(平均值±标准差。 7 次运行,每次 100000 次循环) 2. 7.43 µs ± 35 ns 每个循环(平均值 ± 7 次运行的标准偏差,每次 100000 次循环) 3. 7.69 µs ± 78.9 ns 每个循环(平均值 ± 7 次运行的标准偏差, 每个循环 100000)
      【解决方案4】:

      试试这个:

      c.update({'foo': 1})
      

      【讨论】:

      • 这不是@Psidom提供的答案吗?
      • 我回答的时候没看到。
      • 既然您已经看到您的答案实际上是先前提供的答案的精确副本并且没有提供新内容,那么您认为应该如何处理您的答案?
      【解决方案5】:

      虽然我最好再举一个例子,你可以增加和减少计数的数量

      from collections import Counter
      
      counter = Counter(["red", "yellow", "orange", "red", "orange"])
      # to increase the count
      counter.update({"yellow": 1})
      # or
      counter["yellow"] += 1
      
      # to decrease
      counter.update({"yellow": -1})
      # or
      counter["yellow"] -= 1
      

      【讨论】:

        【解决方案6】:

        我最近遇到了同样的问题。你也可以像这样把它放在一个元组中。

        c.update(('red',))
        

        之前的答案并没有建议这个替代方案,所以我不妨在这里发布。

        【讨论】:

          猜你喜欢
          • 2014-07-17
          • 1970-01-01
          • 2015-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-11
          • 2019-01-19
          • 1970-01-01
          相关资源
          最近更新 更多