python-collections包Counter的介绍和简单应用

先贴一道leetcode题:

1160. 拼写单词

给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars

假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。

注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。

返回词汇表 words 中你掌握的所有单词的 长度之和

示例 1:

输入:words = ["cat","bt","hat","tree"], chars = "atach"
输出:6
解释:
可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。

解法:1. collections.Counter可以快速记录每个元素出现的频数 2. for循环后的else表示正常循环后执行的操作

class Solution:
    def countCharacters(self, words: List[str], chars: str) -> int:
        cd = collections.Counter(chars)
		# 返回的对象类似:Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})
        sum = 0
        for w in words:
            wd = collections.Counter(w)
            for i in wd:
                if wd[i] <= cd[i]: continue
                else: break
            else: # 没有break,正常循环后执行的操作
                sum += len(w)
        return sum

下面是常用的用法:

from collections import Counter

colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
c = Counter(colors)
print(dict(c)) # {'red': 2, 'blue': 3, 'green': 1}
# 当然也可以对str计数咯

# 定义&传值
c = Counter()
c = Counter('gallahad')
c = Counter({'red': 4, 'blue': 2})
c = Counter(cats=4, dogs=8) # Counter({'dogs': 8, 'cats': 4})
# 删除元素
del c['dogs']
# 获得所有元素
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements()) # 显然只显示数量>0的
['a', 'a', 'a', 'a', 'b', 'b']
# 但是用c.keys()和c.values()都是显示所有元素的

# 查找最常见的n个元素。如果不带参数就是value降序的所有元素
>>> Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]
>>> Counter('abracadabra').most_common(2)
[('a', 5), ('b', 2)]

# 计算
>>> c = Counter(a = 3, b = 1)
>>> d = Counter(a = 1, b = 2)
# 对应元素的值相加
>>> c + d 
Counter({'a': 4, 'b': 3})
# 注意update是不一样的,它也是对应元素相加,而且in-place
>>> e = Counter(a = 2, b = 1, c = 0)
>>> f = Counter(a = 1, b = -1)
>>> e.update(f)
>>> e
Counter({'a': 3, 'b': 0, 'c': 0})

# 对应元素的值相减,<=0的删掉
>>> c - d
Counter({'a': 2})
# 注意subtract是不一样的,它是in-place的,而且负值会保留
>>> c.subtract(d)
>>> c
Counter({'a': 2, 'b': -1})

# 求各个元素值的最小值
>>> c & d
Counter({'a': 1, 'b': 1})
# 反之,求最大
>>> c | d
Counter({'a': 3, 'b': 2})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值