您的位置:首页 > 编程语言 > Python开发

Python学习Day5

2019-10-27 11:36 1146 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_45553736/article/details/102765170

字典

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。

第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。

dict就是第二种实现方式,给定一个名字,比如’Michael’,dict在内部就可以直接计算出Michael对应的存放成绩的“页码”,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快。

这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。

  • 和list比较,dict有以下几个特点:

查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存,内存浪费多。

  • 而list相反:

查找和插入的时间随着元素的增加而增加;

占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。

dict的key必须是不可变对象。

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:

如何快速判断一个数据类型 X 是不是可变类型的呢

麻烦方法:用 id(X) 函数,对 X 进行某种操作,比较操作前后的 id,如果不一样,则 X 不可变,如果一样,则 X 可变。

便捷方法:用 hash(X),只要不报错,证明 X 可被哈希,即不可变,反过来不可被哈希,即可变。

字典定义

「字典」定义语法为 {元素1, 元素2, …, 元素n}
字典是无序的 键:值对(key:value 对)集合,键必须是互不相同的(在同一个字典之内)

创建和访问字典

dict(object) 函数用于创建一个字典。
dict() -> 创建空字典
dict(mapping) -> 映射
dict(iterable) ->迭代

d = {}
for k, v in iterable:
d[k] = v

dict(**kwargs) -> For example: dict(one=1, two=2)

dict 内部存放的顺序和 key 放入的顺序是没有关系的。
dict 查找和插入的速度极快,不会随着 key 的增加而增加,但是需要占用大量的内存。

把数据放入 dict 还可以直接通过 key 放入。

一个 key 只能对应一个 value,多次对一个 key 放入 value,后面的值会把前面的值冲掉。

ict5 = dict(a=1, b=2, c=3)
print(dict5)
# {'b': 2, 'a': 1, 'c': 3}

dict5['a'] = 11
print(dict5)
# {'b': 2, 'a': 11, 'c': 3}

dict5['d'] = 4
print(dict5)
# {'d': 4, 'c': 3, 'a': 11, 'b': 2}

字典的内置方法

dict.fromkeys(seq[, value])
用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。

seq = ('name', 'age', 'sex')
dict6 = dict.fromkeys(seq)
print("新的字典为 : %s" % str(dict6))
# 新的字典为 : {'name': None, 'age': None, 'sex': None}

dict6 = dict.fromkeys(seq, 10)
print("新的字典为 : %s" % str(dict6))
# 新的字典为 : {'name': 10, 'age': 10, 'sex': 10}

dict6 = dict.fromkeys(seq, ('小马', '8', '男'))
print("新的字典为 : %s" % str(dict6))
# 新的字典为 : {'name': ('小马', '8', '男'), 'age': ('小马', '8', '男'), 'sex': ('小马', '8', '男')}

dict.keys()返回一个可迭代对象,可以使用 list() 来转换为列表。
dict.values()返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值
dict.items()以列表返回可遍历的(键, 值) 元组数组。
dict.get(key, default=None)返回指定键的值,如果值不在字典中返回默认值。
key in dict in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回true,否则返回false。而not in操作符刚好相反,如果键在字典 dict 里返回false,否则返回true。
dict.clear()用于删除字典内所有元素。
dict.copy()返回一个字典的浅复制。
ict.pop(key[,default])删除字典给定键 key 所对应的值,返回值为被删除的值。key 值必须给出。否则,返回 default 值。
del dict[key] 删除字典给定键 key 所对应的值。
dict.popitem()随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。
dict.setdefault(key, default=None)和get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
dict.update(dict2)把字典参数 dict2 的 key/value(键/值) 对更新到字典 dict 里

集合set

与dict类似,set也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

num = {}
print(type(num))  # <class 'dict'>
num = {1, 2, 3, 4}
print(type(num))  # <class 'set'>

故没有空的集合set

集合的创建

直接把一堆元素用花括号括起来{元素1, 元素2, …, 元素n},重复元素在set中会被自动被过滤。
使用

set(value)
工厂函数,把列表或元组转换成集合。
故可以利用此特性去掉list中的重复元素

从结果发现集合的两个特点:无序 (unordered) 和唯一 (unique)。由于 set 存储的是无序集合,所以我们没法通过索引来访问,但是可以判断一个元素是否在集合中。
字典也是无序的

访问集合中的值

可以使用for把集合中的数据一个个读取出来。

thisset = set(['Google', 'Baidu', 'Taobao'])
for item in thisset:
print(item)

# Baidu
# Google
# Taobao

可以通过in或not in判断一个元素是否在集合中已经存在

集合的内置方法

  1. set.add(elmnt)用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作。
  2. set.remove(item)用于移除集合中的指定元素。
  3. set.update(set)用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。
  4. 由于 set 是无序和无重复元素的集合,所以两个或多个 set 可以做数学意义上的集合操作。
    set.intersection(set1, set2 …)用于返回两个或更多集合中都包含的元素,即交集。

set.union(set1, set2…)返回两个集合的并集,即包含了所有集合的元素,重复的元素只会出现一次。

set.difference(set) 返回集合的差集,即返回的集合元素包含在第一个集合中,但不包含在第二个集合(方法的参数)中。
***set.issubset(set)用于判断集合的所有元素是否都包含在指定集合中,如果是则返回 True,否则返回 False。
set.issuperset(set)用于判断指定集合的所有元素是否都包含在原始的集合中,如果是则返回 True,否则返回 False。***这两个对偶

不可变集合

frozenset([iterable]) 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。

a = frozenset(range(10))  # 生成一个新的不可变集合
print(a)
# frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})

b = frozenset('lsgogroup')
print(b)
# frozenset({'g', 's', 'p', 'r', 'u', 'o', 'l'})

学习总结

加油加油
Todd

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: