python collection.Counter() for leetcode 811 Subdomain Visit Count

在刷leetcode 811题时,单纯用字典去写会比较繁琐,看到答案里有人用到了collection模块中的Counter()类,感觉so方便啊

先贴上这个题的答案:

class Solution(object):
    def subdomainVisits(self, cpdomains):
        """
        :type cpdomains: List[str]
        :rtype: List[str]
        """
        c = collections.Counter()
        for cp in cpdomains:
            num,word = cp.split()
            c[word] += int(num)
            for i in range(len(word)):
                if word[i]=='.':
                    c[word[i+1:]] += int(num)
        return ['%s %s'%(c[k],k) for k in c]

Counter类的作用是用来跟踪key值出现的次数,是无序的,以字典键值对的形式存储,(key,value);value可以是任意的Integer

Counter类的创建

>>> from collections import Counter
>>> c = Counter()
>>> c = Counter('happy')#从一个可iterable对象创建(包括list,tuple,dict,字符串等)
>>> c
Counter({'p': 2, 'h': 1, 'a': 1, 'y': 1})
>>> c = Counter({'a':1,'b':2})#从一个字典对象创建
>>> c
Counter({'b': 2, 'a': 1})
>>> c = Counter(a =3,b=7)#从一组键值对创建
>>> c
Counter({'b': 7, 'a': 3})

计数器的更新(update 和 subtract)

>>> c = Counter('happy')
>>> c.update('puppy')
>>> c
Counter({'p': 5, 'y': 2, 'h': 1, 'a': 1, 'u': 1}) #更新后相应key,value都更新了
>>> d = Counter('pull')
>>> c.update(d)#也可以直接作用Counter对象进行更新
>>> c
Counter({'p': 6, 'y': 2, 'u': 2, 'l': 2, 'h': 1, 'a': 1})


>>> c = Counter('happy')
>>> c.subtract('apple')
>>> c
Counter({'h': 1, 'y': 1, 'a': 0, 'p': 0, 'l': -1, 'e': -1})

elements(),按照重复次数返回key值,<=0的key不返回

>>> c = Counter(a=1,b=3,c=2,d=-1,e=0)
>>> c
Counter({'b': 3, 'c': 2, 'a': 1, 'e': 0, 'd': -1})
>>> c.elements()
<itertools.chain object at 0x0000020A50AD3748>
>>> list(c.elements())
['a', 'b', 'b', 'b', 'c', 'c']
>>> 

还有一些常用的操作:

sum(c.values())  # 所有计数的总数
c.clear()  # 重置Counter对象,注意不是删除
list(c)  # 将c中的键转为列表
set(c)  # 将c中的键转为set
dict(c)  # 将c中的键值对转为字典
c.items()  # 转为(elem, cnt)格式的列表
Counter(dict(list_of_pairs))  # 从(elem, cnt)格式的列表转换为Counter类对象
c.most_common()[:-n:-1]  # 取出计数最少的n-1个元素
c += Counter()  # 移除0和负值

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值