Python字典Dictionary

Python字典Dictionary

Python字典介绍

Python 字典是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。他的存储模式和MapReduce十分的相像,对于我们前面所学习的列表以及元组来说,他们的区别为:列表和元组是有序的序列,并且它们的元素在底层是挨着存放的。

前面我们说到Python中字典和MapReduce的存储模式十分的类似,他所描述的是一种映射关系,指的是元素之间相互对应的关系,也就是说通过一个元素我们可以查找到另一个元素,即所谓的Key-Value。这种建及其关联的值称为“键值对”。

在Python中,Python字典的主要特征为一下几个方面

主要特征介绍
通过键而不是通过索引来读取元素字典类型有时也称为关联数组或者散列表(hash)。它是通过键将一系列的值联系起来的,这样就可以通过键从字典中获取指定项,但不能通过索引来获取。
字典是任意数据类型的无序集合和列表、元组不同,通常会将索引值 0 对应的元素称为第一个元素,而字典中的元素是无序的。
字典是可变的,并且可以任意嵌套字典可以在原处增长或者缩短(无需生成一个副本),并且它支持任意深度的嵌套,即字典存储的值也可以是列表或其它的字典
字典中的键必须唯一字典中,不支持同一个键出现多次,否则只会保留最后一个键值对。
字典中的键必须不可变字典中每个键值对的键是不可变的,只能使用数字、字符串或者元组,不能使用列表。

Python中创建字典

在Python中有三种方式可以创建字典。

1、 使用 { } 创建字典

由于字典中每个元素都包含两部分,分别是键(key)和值(value),因此在创建字典时,键和值之间使用冒号“:”分隔,相邻元素之间使用逗号”,“分隔,所有元素放在大括号{ }中。

使用{ }创建字典的语法格式如下:

dictname = {‘key1’:‘value1’, ‘key2’:‘value2’}
dictname 表示字典变量名,key1 : value1 表示各个元素的键值对。
Tip:同一字典中的各个键必须唯一,不能重复。

#使用字符串作为key
students_age = {'小明': 18, '小红': 17, '小李': 20}
print(students_age)
#使用元组和数字作为key或者Values
dictionary= {(1, 2): '上山打老虎', '上山打老虎': [1,2]}
print(dictionary)
#创建空元组
dictionary1 = {}
print(dictionary1)

运行结果为:

{'小明': 18, '小红': 17, '小李': 20}
{(1, 2): '上山打老虎', '上山打老虎': [1, 2]}
{}

从结果可以看到,字典的键可以是整数、字符串或者元组,只要符合唯一和不可变的特性就行;字典的值可以是 Python 支持的任意数据类型。
2、通过 fromkeys() 方法创建字典
Python 中,还可以使用 dict 字典类型提供的 fromkeys() 方法创建带有默认值的字典,具体格式为:

dictname = dict.fromkeys(list,value=None)
list 参数表示字典中所有键的列表(list);value 参数表示默认值,如果不写,则为空值 None。

student = ['xiaoming', 'xiaohong', 'xiaojun']
age = dict.fromkeys(knowledge, 18)
print(age)

运行的结果为:

{'语文': 18, '数学': 18, '英语': 18}

从运行结果可以看清楚,这种创建方式通常用于初始化字典,设置 value的默认值。

3、通过 dict() 映射函数创建字典

通过 dict() 函数创建字典的写法有多种,下面列出了常用的几种方式,它们创建的都是同一个字典 a。

a = dict(str1=value1, str2=value2, str3=value3) | str 表示字符串类型的键,value 表示键对应的值。使用此方式创建字典时,字符串不能带引号。

#方式1
demo = [(‘two’,2), (‘one’,1), (‘three’,3)]
#方式2
demo = [[‘two’,2], [‘one’,1], [‘three’,3]]
#方式3
demo = ((‘two’,2), (‘one’,1), (‘three’,3))
#方式4
demo = ([‘two’,2], [‘one’,1], [‘three’,3])
a = dict(demo)
向 dict() 函数传入列表或元组,而它们中的元素又各自是包含 2 个元素的列表或元组,其中第一个元素作为键,第二个元素作为值。

keys = [‘one’, ‘two’, ‘three’] #还可以是字符串或元组
values = [1, 2, 3] #还可以是字符串或元组
a = dict( zip(keys, values) )
通过应用 dict() 函数和 zip() 函数,可将前两个列表转换为对应的字典。

注意:无论采用以上哪种方式创建字典,字典中各元素的键都只能是字符串、元组或数字,不能是列表。列表是可变的,不能作为键。

Python访问字典

列表和元组是通过下标来访问元素的,而字典不同,它***通过键来访问对应的值***。因为字典中的元素是无序的,每个元素的位置都不固定,所以字典也不能像列表和元组那样,采用切片的方式一次性访问多个元素。

1、使用通过键来访问对应的值访问字典元素

具体格式为:

dictname[key]
dictname 表示字典变量的名字,key 表示键名。注意,键必须是存在的,否则会抛出异常。

下面给出例子:

student = (['小明',12], ['小红',13], ['小刚',14], ['小李',18])
dict1 = dict(student)
print(dict1['小明'])  #键存在
print(dict1['小军'])  #键不存在

运行结果为:

12
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-10-3fefa1284357> in <module>

2、Python中使用 get() 方法来获取指定键对应的值。(更推荐使用)

当指定的键不存在时,get() 方法不会抛出异常。具体格式为:

dictname.get(key[,default])
dictname 表示字典变量的名字;key 表示指定的键;default 用于指定要查询的键不存在时,此方法返回的默认值,如果不手动指定,会返回 None。

student = (['小明',12], ['小红',13], ['小刚',14], ['小李',18])
dict1 = dict(student)
print( dict1.get('小明') )

运行结果为:12

注意:当键不存在时,get() 返回空值 None,如果想明确地提示用户该键不存在,那么可以手动设置 get() 的第二个参数

student = (['小明',12], ['小红',13], ['小刚',14], ['小李',18])
dict1 = dict(student)
print( dict1.get('小军', '没有该学生') )

运行结果为:没有该学生

Python删除字典

在Python中,删除字典可以使用关键字del删除字典。但是Python自带垃圾回收功能,会自动销毁不用的字典。

student = (['小明',12], ['小红',13], ['小刚',14], ['小李',18])
dict1 = dict(student)
print(dict1)
del dict1
print(dict1)

运行结果为:

{'two': 0.65, 'one': 88, 'three': 100, 'four': -59}
Traceback (most recent call last):
    File "C:\Users\mozhiyan\Desktop\demo.py", line 4, in <module>
        print(a)
NameError: name 'a' is not defined

Python字典常用操作

1、Python字典添加键值对

为字典添加新的键值对很简单,直接给不存在的 key 赋值即可,具体语法格式如下:

dictname[key] = value

  • dictname 表示字典名称。
  • key 表示新的键。
  • value 表示新的值,只要是 Python 支持的数据类型都可以。
students = {'小明':18}
print(students)
#添加新键值对
students['小文'] = 20
print(students)
#再次添加新键值对
students['小美'] = 17
print(students)

运行结果为:

{'小明': 18}
{'小明': 18, '小文': 20}
{'小明': 18, '小文': 20, '小美': 17}

2、Python字典修改键值对

Python 字典中键(key)的名字不能被修改,我们只能修改值(value)。

字典中各元素的键必须是唯一的,因此,如果新添加元素的键与已存在元素的键相同,那么键所对应的值就会被新的值替换掉,以此达到修改元素值的目的。

students= {'小明': 18, '小文': 20, '小美': 17}
print(students)
students['小明'] = 19
print(students)

运行结果为:

{'小明': 18, '小文': 20, '小美': 17}
{'小明': 19, '小文': 20, '小美': 17}

3、Python字典删除键值对

如果要删除字典中的键值对,还是可以使用 del 语句。

# 使用del语句删除键值对
students= {'小明': 18, '小文': 20, '小美': 17}
print(students)
del students['小明']
print(students)

运行结果为:

{'小明': 18, '小文': 20, '小美': 17}
{'小文': 20, '小美': 17}

3、字典中是否存在指定键值对

如果要判断字典中是否存在指定键值对,首先应判断字典中是否有对应的键。判断字典是否包含指定键值对的键,可以使用 in 或 not in 运算符。

对于 dict 而言,in 或 not in 运算符都是基于 key 来判断的。

students= {'小明': 18, '小文': 20, '小美': 17}
# 判断 students 中是否包含名为'小明'的key
print('小明' in students) # True
# 判断 a 是否包含名为'物理'的key
print('小丽' in students) # False

运行结果为:

True
False

Python字典常用函数

1、keys()、values() 和 items() 方法

在Python中,这三个函数都用来获取字典中的特定数据,下面为这三个方法的介绍:

  • keys() 方法用于返回字典中的所有键(key);
  • values() 方法用于返回字典中所有键对应的值(value);
  • items() 用于返回字典中所有的键值对(key-value);
students= {'小明': 18, '小文': 20, '小美': 17}
print(students.keys())
print(students.values())
print(students.items())

运行结果为:

dict_keys(['小明', '小文', '小美'])
dict_values([18, 20, 17])
dict_items([('小明', 18), ('小文', 20), ('小美', 17)])

可以发现放回类型不是一个List列表类型,这是因为在Python 3中,它们的返回值并不是我们常见的列表或者元组类型。下面介绍两种方法,返回他们的数据:

  • 使用 list() 函数,将它们返回的数据转换成列表。
  • 使用 for in 循环遍历它们的返回值。

具体例子为:

students= {'小明': 18, '小文': 20, '小美': 17}
b=list(students.keys())
print(b)
students= {'小明': 18, '小文': 20, '小美': 17}
for k in students.keys():
    print(k,end=' ')
print("\n---------------")
for v in students.values():
    print(v,end=' ')
print("\n---------------")
for k,v in students.items():
    print("key:",k," value:",v)

运行结果分别为:

['小明', '小文', '小美']
小明 小文 小美 
---------------
18 20 17 
---------------
key: 小明  value: 18
key: 小文  value: 20
key: 小美  value: 17

从上述结果可以得知获得了字典中的数据。

2、copy() 方法——拷贝
顾名思义,copy() 方法返回一个字典的拷贝,也即返回一个具有相同键值对的新字典。

students= {'小明': 18, '小文': 20, '小美': [1,2,3]}
abc= students.copy()
print(abc)
{'小明': 18, '小文': 20, '小美': [1,2,3]}

注意:copy() 方法所遵循的拷贝原理,既有深拷贝,也有浅拷贝。拿拷贝字典 students 为例,copy() 方法只会对最表层的键值对进行深拷贝,也就是说,它会再申请一块内存用来存放{‘小明’: 18, ‘小文’: 20, ‘小美’: 17};而对于某些列表类型的值来说,此方法对其做的是浅拷贝,也就是说,abc 中的 [1,2,3] 的值不是自己独有,而是和 a 共有。
#向 a 中添加新键值对,由于b已经提前将 a 所有键值对都深拷贝过来,因此 a 添加新键值对,不会影响 b。
#移除 a 中列表中的元素,也会影响 b。

3、update() 方法

update() 方法可以使用一个字典所包含的键值对来更新己有的字典。

在执行 update() 方法时,如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。

students= {'小明': 18, '小文': 20, '小美': 17}
students.update({'小军':19, '小红': 20,'小美':1})
print(students)
{'小明': 18, '小文': 20, '小美': 1, '小军': 19, '小红': 20}

从运行结果可以看出,需要添加的字典的键中,若原来字典中无该键值会添加进字典中,若原来字典中有该键值,会更新该键(Key)所对应的值(Values)。

4、pop() 和 popitem() 方法

pop() 和 popitem() 都用来删除字典中的键值对,不同的是,pop() 用来删除指定的键值对,而 popitem() 用来随机删除一个键值对,它们的语法格式如下:

dictname.pop(key)
dictname.popitem()
dictname 表示字典名称,key 表示键

students= {'小明': 18, '小文': 20, '小美': 17,'小军':19,'小红': 20}
print(students)
students.pop('小明')
print(students)
students.popitem()
print(students)

运行结果为:

{'小明': 18, '小文': 20, '小美': 17, '小军': 19, '小红': 20}
{'小文': 20, '小美': 17, '小军': 19, '小红': 20}
{'小文': 20, '小美': 17, '小军': 19}

Tip:popitem() 总是弹出底层中的最后一个 key-value,这和列表的 pop() 方法类似,都实现了数据结构中“出栈”的操作。

5、setdefault() 方法

setdefault() 方法用来返回字典中某个key对应的value,其语法格式如下:

dictname.setdefault(key, defaultvalue)
dictname 表示字典名称,key 表示键,defaultvalue 表示默认值(可以不写,不写的话是 None)。

当指定的 key 不存在时,setdefault() 会先为这个不存在的 key 设置一个默认的 defaultvalue,然后再返回 defaultvalue。即setdefault() 方法总能返回指定 key 对应的 value:

  • 如果该 key 存在,那么直接返回该 key 对应的 value。
  • 如果该 key 不存在,那么先为该 key 设置默认的 defaultvalue,然后再返回该 key 对应的 defaultvalue。
students= {'小明': 18, '小文': 20, '小美': 17,'小军':19,'小红': 20}
print(students)
#key不存在,指定默认值,返回小丽的值为15
students.setdefault('小丽', 15)
print(students)
#key不存在,不指定默认值,返回小爱的值为None
students.setdefault('小爱')
print(students)
#key存在,指定默认值,返回字典中的值
students.setdefault('小明', 30)
print(students)

运行结果为:

{'小明': 18, '小文': 20, '小美': 17, '小军': 19, '小红': 20}
{'小明': 18, '小文': 20, '小美': 17, '小军': 19, '小红': 20, '小丽': 15}
{'小明': 18, '小文': 20, '小美': 17, '小军': 19, '小红': 20, '小丽': 15, '小爱': None}
{'小明': 18, '小文': 20, '小美': 17, '小军': 19, '小红': 20, '小丽': 15, '小爱': None}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值