前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《流畅的Python》第三章学习笔记

《流畅的Python》第三章学习笔记

作者头像
zx钟
发布2020-12-11 14:33:58
4580
发布2020-12-11 14:33:58
举报
文章被收录于专栏:测试游记测试游记

散列表是字典类型性能出众的根本原因

可散列的数据类型:如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现__hash__() 方法

需要有__eq__()方法才可以与其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的。 散列值:对象的id()函数的返回值

  • 可散列

一个可散列的对象必须满足以下要求。

(1) 支持 hash() 函数,并且通过 hash__() 方法所得到的散列值是不变的。(2) 支持通过 __eq() 方法来检测相等性。 (3) 若 a == b 为真,则 hash(a) == hash(b) 也为真。

字典的构造方法

代码语言:javascript
复制
a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('one', 1), ('two', 2), ('three', 3)])
e = dict({"one": 1, "two": 2, "three": 3})
f = {i: j for i, j in [("one", 1), ("two", 2), ("three", 3)]} # 字典推导式

统计一串字符各个字母出现的索引值

代码语言:javascript
复制
test_str = 'ashjdlkqashfljkaskldfjalshflaksdnvklzkxcbfihqwdjuabs'

使用常规方法

代码语言:javascript
复制
for index, s in enumerate(test_str):
    if s not in my_dict:
        my_dict[s] = []
    my_dict[s].append(index)

使用setdefault

代码语言:javascript
复制
my_dict = {}
for index, s in enumerate(test_str):
    my_dict.setdefault(s, []).append(index)

弹性键查询

使用defaultdict

上面的问题使用defaultdict可以很方便的解决

代码语言:javascript
复制
import collections

my_dict = collections.defaultdict(list)
for index, i in enumerate(test_str):
    my_dict[i].append(index)

defaultdict在使用get方法的时候不会自动创建默认的类型

missing

代码语言:javascript
复制
print(my_dict['a1'])  # []
print(my_dict.get('a2'))  # None

字典的变种

OrdereDict

  • 有顺序的字典:collections.OrdereDict
代码语言:javascript
复制
import collections

a = collections.OrderedDict()
a['a'] = 1
a['c'] = 3
a['b'] = 2
print(a)  # OrderedDict([('a', 1), ('c', 3), ('b', 2)])
a.popitem()
print(a)  # OrderedDict([('a', 1), ('c', 3)])

ChainMap

  • 容纳不同的映射对象collections.ChainMap

一个 ChainMap 类是为了将多个映射快速的链接到一起,这样它们就可以作为一个单元处理。它通常比创建一个新字典和多次调用 update() 要快很多。 这个类可以用于模拟嵌套作用域,并且在模版化的时候比较有用。

将多个字典或者其他映射组合在一起,创建一个单独的可更新的视图

代码语言:javascript
复制
b = collections.ChainMap(locals())

b

创建一个对象,它内部包含了当前的局部变量

直接使用b['a']方法去查找内容

!b['a']

Counter

  • 计数:collections.Counter
代码语言:javascript
复制
c = collections.Counter("asfsdfasdfasdfasdf")
print(c)# Counter({'s': 5, 'f': 5, 'a': 4, 'd': 4})

UserDict

纯python实现的dict

注意点:速度是以牺牲空间为代价而换来的

字典在内存上的开销巨大。

如果需要存储数量巨大的内容,推荐使用元祖或者具名元祖。

字典的实现是典型的空间换时间

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字典的构造方法
  • 统计一串字符各个字母出现的索引值
    • 使用常规方法
      • 使用setdefault
      • 弹性键查询
        • 使用defaultdict
        • 字典的变种
          • OrdereDict
            • ChainMap
              • Counter
                • UserDict
                • 注意点:速度是以牺牲空间为代价而换来的
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档