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

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

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

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

  • 可散列

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

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

字典的构造方法

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)]} # 字典推导式

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

test_str = 'ashjdlkqashfljkaskldfjalshflaksdnvklzkxcbfihqwdjuabs'

使用常规方法

for index, s in enumerate(test_str):
    if s not in my_dict:
        my_dict[s] = []
    my_dict[s].append(index)

使用setdefault

my_dict = {}
for index, s in enumerate(test_str):
    my_dict.setdefault(s, []).append(index)

弹性键查询

使用defaultdict

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

import collections

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

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

missing
print(my_dict['a1'])  # []
print(my_dict.get('a2'))  # None

字典的变种

OrdereDict

  • 有顺序的字典:collections.OrdereDict

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() 要快很多。

这个类可以用于模拟嵌套作用域,并且在模版化的时候比较有用。

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

b = collections.ChainMap(locals())
b

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

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

!b['a']

Counter

  • 计数:collections.Counter

c = collections.Counter("asfsdfasdfasdfasdf")
print(c)# Counter({'s': 5, 'f': 5, 'a': 4, 'd': 4})

UserDict

纯python实现的dict

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

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

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

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

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值