新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 程序开发 > 语言 > Python

高效利用Python内置的数据结构

时间:2019-08-13 11:57:30  来源:  作者:

0x00:创建一键多值字典

字典是Python中的一种可变容器,通常以这种形式出现:

d = {key1:value1, key2:value2, key3:value3}

Python没有规定字典中值的类型,所以如果想让字典中的一个键对应多个值,只要把这些值放到列表这样的容器里就行了。

Python资源共享群:484031800

student = {
 'a': [76, 54, 82],
 'b': [92, 67, 88]
}

为了方便创建这样的字典,可以使用 collections 模块中的 defaultdict 类。一般在访问一个字典中不存在的key时会报错,defaultdict类则会自动初始化一个默认值。使用defaultdict可以这样创建一个值为列表的字典:

d = defaultdict(list)
d['a'].Append(1)
d['a'].append(2)
d['a'].append(3)

0x01:有序字典

Python中字典的key是不记录顺序的,如果我们想在对字典进行迭代或者序列化操作时掌握元素的顺序,可以使用 collections 模块中的 OrderedDict 类。

>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d['a'] = 1
>>> d['b'] = 2
>>> d['c'] = 3
>>> for key in d:
... print(key, d[key])
... 
a 1
b 2
c 3

OrderedDict内部维护了一个双向链表,每当字典中创建新元素,就会被放到链表的末尾。对已存在的键重新赋值不会改变键的顺序。由于OrderedDict创建了额外的链表,所以占用空间会比普通的字典要多。使用这个类要注意取舍。

0x02:对序列去重但保持顺序不变

要想去除一个列表中的重复项,只需要使用 set() 就可以了,set创建一个无重复项的集合,可以对其求交集、并集等操作。但是,这种集合对象是无序的。

>>> a = [1, 4, 6, 1, 2, 1, 3, 6, 2]
>>> b = set(a)
>>> b
{1, 2, 3, 4, 6}

如果你既想要去除重复项,又想保留顺序,可以通过 set() 加生成器的方式解决:

def dedupe(items):
 seen = set()
 for item in items:
 if item in items:
 if item not in seen:
 yield item
 seen.add(item)

这只有当序列中的元素是不可变对象时起作用,例如整数、字符串、元组。如果要应用在列表这类可变容器上,要对代码稍作修改:

def dedupe(items):
 seen = set()
 for item in items:
 val = item if key is None else key(item)
 if val not in seen:
 yield item
 seen.add(val)

这里使用key参数来指定一个函数将序列中元素转变为不可变类型。

0x03:统计元素的数量

如何找出一本书中出现频率最高的单词呢?或者想知道一个列表中相同元素出现的次数应该怎么做?使用 collections 模块中的 Counter 类可以轻松做到。

>>> from collections import Counter
>>> words = ['apple', 'keys', 'double', 'dude', 'eye', 'love', 'magic', 'double', 'magic', 'spell', 'apple', 'point', 'apple']
>>> count = Counter(words)
>>> count
Counter({'apple': 3, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1})

还可以使用Counter类的 most_common 方法来求排名前几的元素:

>>> top = count.most_common(3)
>>> print(top)
[('apple', 3), ('double', 2), ('magic', 2)]
>>>

另外,Counter对象还可以做数学运算:

>>> words = ['apple', 'keys', 'double', 'dude', 'eye', 'love', 'magic', 'double', 'magic', 'spell', 'apple', 'point', 'apple']
>>> other = ['apple', 'cool', 'duck', 'cookie']
>>> a = Counter(words)
>>> b = Counter(other)
>>> a
Counter({'apple': 3, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1})
>>> b
Counter({'apple': 1, 'cool': 1, 'duck': 1, 'cookie': 1})
>>> a + b
Counter({'apple': 4, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1, 'cool': 1, 'duck': 1, 'cookie': 1})
>>>

Counter 类能够帮助我们很好地对数据做统计,当然,如果你是在做算法题,请不要使用它来取巧。

0x04:字典推导式

想要创建一个字典的子集,可以用字典推导式(dictionary comprehension)轻松搞定。没错,列表有列表生成式,字典也有字典推导式。

>>> students = {'a':98, 'b':45, 'c':73, 'd':59}
>>> passed = {key:value for key, value in students.items() if value >= 60}
>>> passed
{'a': 98, 'c': 73}
>>>

看,我们很轻松地通过记录所有学生成绩的字典获得了及格学生的成绩。



Tags:Python 数据结构   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
0x00:创建一键多值字典字典是Python中的一种可变容器,通常以这种形式出现:d = {key1:value1, key2:value2, key3:value3}Python没有规定字典中值的类型,所以如果想让字典中的一...【详细内容】
2019-08-13   Python 数据结构  点击:(0)  评论:(0)  加入收藏
01 如何选择合适的数据结构?为什么这很重要?编程语言中的数据结构是用来整理和存储数据。数据结构自身内部就定义了很多方法用来处理数据,不同的数据结构拥有不能的优势,这篇...【详细内容】
2019-07-29   Python 数据结构  点击:(16)  评论:(0)  加入收藏
推荐资讯
相关文章
栏目更新
栏目热门