How to add or increment single item of the Python Counter class

前端 未结 3 584
自闭症患者
自闭症患者 2020-12-30 21:09

A set uses .update to add multiple items, and .add to add a single one.

Why doesn\'t collections.Counter work the same way?

相关标签:
3条回答
  • 2020-12-30 21:21
    >>> c = collections.Counter(a=23, b=-9)
    

    You can add a new element and set its value like this:

    >>> c['d'] = 8
    >>> c
    Counter({'a': 23, 'd': 8, 'b': -9})
    

    Increment:

    >>> c['d'] += 1
    >>> c
    Counter({'a': 23, 'd': 9, 'b': -9} 
    

    Note though that c['b'] = 0 does not delete:

    >>> c['b'] = 0
    >>> c
    Counter({'a': 23, 'd': 9, 'b': 0})
    

    To delete use del:

    >>> del c['b']
    >>> c
    Counter({'a': 23, 'd': 9})
    

    Counter is a dict subclass

    0 讨论(0)
  • 2020-12-30 21:29

    There is a more Pythonic way to do what you want:

    c = Counter(item.property for item in something if item.has_some_property)
    

    It uses a generator expression instead of open-coding the loop.

    Edit: Missed your no-list-comprehensions paragraph. I still think this is the way to actually use Counter in practice. If you have too much code to put into a generator expression or list comprehension, it is often better to factor that into a function and call that from a comprehension.

    0 讨论(0)
  • 2020-12-30 21:37

    Well, you don't really need to use methods of Counter in order to count, do you? There's a += operator for that, which also works in conjunction with Counter.

    c = Counter()
    for item in something:
        if item.has_some_property:
            c[item.property] += 1
        elif item.has_some_other_property:
            c[item.other_property] += 1
        elif item.has_some.third_property:
            c[item.third_property] += 1
    
    0 讨论(0)
提交回复
热议问题