在刷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和负值