05 字典(源于Datawhale)

在此谢谢Datawhale提供的资料帮助学习,[1]为资料来源

1. 可变类型和不可变类型

注意区别序列和字典:
(1)序列是以连续的整数为索引
(2)字典是以"关键字"为索引,关键字可以是任意不可变类型,通常用字符串或数值。

那么如何判断一个数据类型x是不是可变类型?
下面两种方法:
(1)麻烦方法:用 id(x) 函数,对x进行某种操作,比较操作前后的 id,如果不一样,则x不可变,如果一样,则x可变。
下面进行举例子:

i = 1
print(id(i))  # 140732167000896
i = i + 2
print(id(i))  # 140732167000960
print(type(i))
# <class 'int'>
l = [1, 2]
print(id(l))  # 4300825160
l.append('Python')
print(id(l))  # 4300825160
print(type(l))
# <class 'list'>

第一个例子:整数i在加了2之后id就和原来不一样了,说明它是不可变类型
第二个例子:列表l在加了Python后还是和原来一样,说明它是可变类型
(2)便捷方法:用 hash(x),只要不报错,证明x可被哈希,即不可变,反过来不可被哈希,即可变。

print(hash('Name'))  # -9215951442099718823
print(type(('Name'))) # <class 'str'>
print(hash((1, 2, 'Python')))  # 823362308207799471
print(type((1, 2, 'Python'))) # <class 'tuple'>

print(hash([1, 2, 'Python']))
# TypeError: unhashable type: 'list'
print(hash({1, 2, 3}))
# TypeError: unhashable type: 'set'

综上所述:数值、字符串和元组都能被哈希,因此它们是不可变类型。
列表、集合、字典不能被哈希,因此它是可变类型。

  • 那么什么是哈希呢?

2. 字典的定义

(1)语法
语法为 {元素1, 元素2, ..., 元素n},其中每一个元素是一个「键值对」-- 键:值 (key:value)
关键点是大括号 {},逗号 ,和冒号 :
大括号:把所有元素绑在一起
逗号:将每个键值对分开
冒号:将键和值分开
(2)课外了解
在同一个字典中,键与键之间是互不一样的。并且字典是无序的。
dict 内部存放的顺序和 key 放入的顺序是没有关系的。
dict 查找和插入的速度极快,不会随着 key 的增加而增加,但是需要占用大量的内存。

综上所述:字典的语法结构是 {key1;value1, key2:value2, ..., keyn:valuen},其中大括号把所有元素(keyi:valuei)包在一起,逗号是分开每个键keyi,键与键之间是不一样的,冒号是分开键keyi和值valuei。字典是无序的。

3. 创建和访问字典

  1. 基本例子
dic = {'李宁': '一切皆有可能', '耐克': 'Just do it', '阿迪达斯': 'Impossible is nothing'}
print('耐克的口号是:', dic['耐克'])  
# 耐克的口号是: Just do it
  1. 数值或者字符串作为key的字典
dic1 = {1: 'one', 2: 'two', 3: 'three'}
print(dic1)  # {1: 'one', 2: 'two', 3: 'three'}
print(dic1[1])  # one
print(dic1[4])  # KeyError: 4

可以发现:
(1)取的键在字典中不存在,会直接报错KeyError
(2)利用数值i作为字典的键位的时候,索引的时候直接是字典[i]

dic2 = {'rice': 35, 'wheat': 101, 'corn': 67}
print(dic2)  # {'wheat': 101, 'corn': 67, 'rice': 35}
print(dic2['rice'])  # 35

可以发现:
(1)自己创建字典后和打印出来字典的顺序是不一样的
(2)利用字符串'string'作为字典的键位的时候,索引的时候直接是字典['string'],要注意引号
3. 元组来作为key的字典

dic = {(1, 2, 3): "Tom", "Age": 12, 3: [3, 5, 7]}
print(dic)  # {(1, 2, 3): 'Tom', 'Age': 12, 3: [3, 5, 7]}
print(type(dic))  # <class 'dict'>

可以发现:
(1)值可以是列表或者数值或者字符串,关键字一般是不可变类型,例如元组、数值、字符串
(2)元组作为键挺别扭的,所以一般少用

  1. dict创建空字典,然后利用key把数据放入字典
    一个key只能对应一个value,同一个key多次放入,后面的值会把前面的值冲掉
dic = dict()
dic['a'] = 1
dic['b'] = 2
dic['c'] = 3

print(dic)
# {'a': 1, 'b': 2, 'c': 3}

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

可以发现:
(1)可以通过对索引键更换键所对应的值

5.利用dict(mapping)
new dictionary initialized from a mapping object’s (key, value) pairs
就像前面所说,同一个字典不能有相同的键,但是不同字典可以有相同的键位

dic1 = dict([('apple', 4139), ('peach', 4127), ('cherry', 4098)])
print(dic1)  # {'cherry': 4098, 'apple': 4139, 'peach': 4127}

dic2 = dict((('apple', 4139), ('peach', 4127), ('cherry', 4098)))
print(dic2)  # {'peach': 4127, 'cherry': 4098, 'apple': 4139}
  1. dict(**kwargs)
    new dictionary initialized with the name=value pairs in the keyword argument list. For example: dict(one=1, two=2)
    这种情况下,键只能为字符串类型,并且创建的时候字符串不能加引号,加上就会直接报语法错误
dic = dict(name='Tom', age=10)
print(dic)  # {'name': 'Tom', 'age': 10}
print(type(dic))  # <class 'dict'>

综上所述,关于字典的创建一共有如下几种方法:
(1)最基本的就是dic1={元组/字符串/数值:列表/数值/字符串}
(2)先用dict()创建一个空字典,然后用key把数据放入,例如

dic=dict()
dic['a']=1

(3)dict(mapping)
例如:

dic1 = dict([('apple', 4139), ('peach', 4127), ])

之前的基本创建是

dic1={元组/字符串/数值:列表/数值/字符串,元组/字符串/数值:列表/数值/字符串}

这个是

dic1 = dict([(元组/字符串/数值,列表/数值/字符串), (元组/字符串/数值,列表/数值/字符串)])

(4)dict(**kwargs)
键只能是字符串,并且创建的时候不能加引号

dic = dict(没有引号的字符串=列表/数值/字符串, 没有印好的字符串=列表/数值/字符串)

值可以通过索引键:字典[键名称]

4. 字典的内置方法

字典的内置方法有如下几种
(1)dict.fromkeys(seq[, value])
(2)dict.keys()
(3)dict.values()
(4)dict.items()
(5)dict.get(key, default=None)
(6)dict.setdefault(key, default=None)
(7)key in dict in
(8)dict.pop(key[,default])
(9)del dict[key]
(10)dict.popitem()
(11)dict.clear()
(12)dict.copy()
(13)dict.update(dict2)

[1]https://github.com/datawhalechina/team-learning-program/blob/master/Python-Language/09.%20%E5%AD%97%E5%85%B8.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值