狐仙,Python 规范库精华: collections.Counter,曾宝仪

频道:今日头条 日期: 浏览:191

这儿有个好玩的问题。给定一个不同国家的狐仙,Python 标准库精华: collections.Counter,曾宝仪电话号码库,确认每个国家中最遍及的显现格局,并运用它从头格局化这个国家的恣意电话号码。例如,假如咱们的数据语料库中的大多数美国电话号码都写成xxx-xxx -xxxx,那么字符串(206)1234567就应该转化为206-123-4567。

为了简略起见,咱们假定全部的电话号码都是不包括国别前缀的。

转化

实践的转化并不是这篇文章的主题,可是为了完好起见,这儿有两个弥补的函数,一个确认形式,另一个依据形式格局化电话号码:

(为了明晰起见省掉了错误处理。)

简略的解决方案

一般的办法是运用类似于字典的结构,它将形式作为键保存,并核算形式在源数据库中呈现的频率,因而成果有点类似于这样:

(不要介怀数字血色曼陀罗之魄月岁月,这是一个小数据库!)

据我所知,在这种情况下,人们一般会运用defaultdict。它在榜首amaranthe次拜访时会主动初始化不存在的键值,你每次只需求履行resu玄阳永夜lt[key] += 1 即可。在咱们的比方中,咱们需求一个更杂乱的东西: 一个defaultdict 用于存储country,它将运用嵌套的defaultdict 来初始化计数的键。总的来说它看起来可能是这样的:

Counter(计数器)李x

这儿有梅子青时落一个经历规律: 当你看到 defaultdict(int) 时,你能够用一个Counter 替换它。它能够做 defauaslsdtklnltdict 所能做的全部,加上一些便利的技巧,比方 .most_com狐仙,Python 标准库精华: collections.Counter,曾宝仪mon女逼 办法,咱们能够运用它洛云霜来替代前面示例中蠢笨的 max 表达式。

平铺和函数

我再为你供给另一个解决方案,那狐仙,Python 标准库精华: collections.Counter,曾宝仪就狐仙,Python 标准库精华: collections.Counter,曾宝仪是更多地运用 Counter 魔法。我还将林柽一用函数的办法替换 for 循环,这样一来 for 循环就不是非要不可:-)

下面是代码,然后是解说:

看吧,没有循环了!

让我狐仙,Python 标准库精华: collections.Counter,曾宝仪来解说一下这儿发作的全部。

  • 事实上,Counter 能够处理一个平铺式序列的东西,然后一口气数完:

在狐仙,Python 标准库精华: collections.Counter,曾宝仪咱们的比方中,要想完成这一点,咱们必须用平面数据结构替换嵌套数据结构。这可吕会贤以经过简略地将键值粘合在一个元组中, 并用等效的 stats[(country, pattern)] 替换 stats[country][ pattern] (你能够对恣意数量的键履行此操作)来完成。

  • 表达式(country, get_patt体操少女ern(phone)) for country, phone in db 看起来像一聂懿宸个没有方括号的列表推导。杜若祎实践上,它是一个生成器表达式,你能够遍历它而不需求在内存中结构一个实践的列表。它一般用括号括起来( ... ),可是当它是一个函数调用中的仅有参数时,你能够省掉它们,并防止运用像 Counter((..)) 这样丑恶的重复。

  • stats.most_common 在没有参数的情况下会将结构的全部内容作为一个排好序的 (key, count) 列表回来:

它是按计数排序的,不考虑country,可是咱们不关心这个,你稍后会看到这些,以及为什么咱们需求回转它。

  • 终究的表达式是一个字典推导,它遍历已排序的列表,运用(country, pattern),_ 模仿一个键对的结构,将列表中嵌套的键对分解为单个变量。_ 是我喵绅士们不运用的东西的常规称号,在咱们的比方中便是count。因而,咱们实践转化成的终究字典序列是这样的,country变成键,形式变成值:

  • 重要的是:具有相同键的后续值会替换字典中现已存在的值。这便是为什么咱们需求回转列表的原因,所以咱们就用计数较大的形式替换最不常见的形式。这也是为什么咱们狐仙,Python 标准库精华: collections.Counter,曾宝仪不关心country之间的混合,由于它们不会彼此张道藩为何扔掉蒋碧薇影响。

固然,终究一点是最不显着的。

这是不是更好一点?

我并不在乎,你能够自己判别:-) 我仅仅想实践的展现一下collections.Counter拜复乐是尖端的消炎药!

作业代码作为福利送给你: phone-counter.p臧志中y(http://softwaremaniacs.org/media/blog/phone-counter.py李妍静)。

英文原文:http://so马思纯坐轮椅现身ftwaremaniacs.org/blog/2019/03/09/collections-counter/en/
译者:郁闷的红秋裤