05 python字典

1、创建字典

  • 字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可以是数、字符串或元组。
  • 字典由(key)及其相应的(value)组成,这种键-值对称为(item)。
  • 在字典中,键必须是唯一的,而字典中的值可以不唯一。
  • 每个键与其值之间都用冒号(:)分隔,项之间用逗号分隔,而整个字典放在花括号内
  • 空字典(没有任何项)用两个花括号表示。

1.1、直接创建字典

>>> dict1 = {}    #空字典
>>> dict1
{}

>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
>>> phonebook['Beth']
'9102'

1.2、函数dict

  • 可使用函数dict从其他映射(如其他字典)或键-值对序列创建字典。
  • dict其实不是函数,而是一个类。
  • 从映射创建字典时,如果该映射也是字典(毕竟字典是Python中唯一的内置映射类型),可不使用函数dict,而是使用字典方法copy。
>>> dict1 = dict()    #如果调用dict函数时没有提供任何实参,将返回一个空字典。
>>> dict1
{}

>>> dict2 = dict(name='Gumby', age=42)    #使用关键字实参来调用dict函数
>>> dict2
{'age': 42, 'name': 'Gumby'}

>>> items = [('name', 'Gumby'), ('age', 42)]
>>> dict3 = dict(items)    #列表可以转字典,但列表中的每个元素必须是成对出现  
>>> dict3
{'age': 42, 'name': 'Gumby'}
>>> dict3['name']
'Gumby'

2、基本的字典操作

2.1、字典和序列类似之处

  • len(d)返回字典d包含的项(键-值对)数。
>>> dict1 = {'张三':88, '李四':66, '王二':100, '麻子':10}
>>> list1 = ['a', 'b', 'c', 'd']

>>> len(dict1)
4
>>> len(list1)
4
  • d[k]返回与键k相关联的值。
>>> dict1['李四']
66
>>> list1[1]
'b'
  • d[k] = v将值v关联到键k。
>>> dict1['张三'] = 59.5
>>> dict1
{'张三': 59.5, '李四': 66, '王二': 100, '麻子': 10}
>>> list1[1] = 0
>>> list1
['a', 0, 'c', 'd']
  • del d[k]删除键为k的项。
>>> del dict1['张三']
>>> dict1
{'李四': 66, '王二': 100, '麻子': 10}
>>> del list1[1]
>>> list1
['a', 'c', 'd']
  • k in d检查字典d是否包含键为k的项。
>>> '王二' in dict1
True
>>> 'c' in list1
True

2.2、字典和列表不同之处

  • 键的类型:字典中的键可以是整数,但并非必须是整数。字典中的键可以是任何不可变的类型,如浮点数(实数)、字符串或元组。列表的索引是整数。
>>> dict1={1.1:'一点一', 100:'一百', 1:99, 'hh':'hengha'}
>>> list1 = ['a', 'b', 'c', 'd', 'e']

>>> dict1[1.1]  #字典用键
'一点一'
>>> list1[1]   #列表用索引
'b'
  • 自动添加:如果字典中没有同名的键(key),则在字典中创建一个新项(键值对);如果有同名的键,新值(value)覆盖旧值。
>>> dict1['hi'] = 'hello'    #字典中没有同名key,添加新项
>>> dict1
{1.1: '一点一', 100: '一百', 1: 99, 'hh': 'hengha', 'hi': 'hello'}
>>> dict1[100] = '壹佰'      #字典中有同名key,进行覆盖
>>> dict1
{1.1: '一点一', 100: '壹佰', 1: 99, 'hh': 'hengha', 'hi': 'hello'}

>>> list1[6] = 'f'          #列表没有此索引,返回异常
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    list1[6] = 'f'
IndexError: list assignment index out of range
>>> list1[4] = 'f'         #列表中有此索引,修改其值
>>> list1
['a', 'b', 'c', 'd', 'f']
  • 成员资格:表达式k in d(其中d是一个字典)查找的是键而不是值,而表达式v in l(其中l是一个列表)查找的是值而不是索引。
>>> 1.1 in dict1  #字典中键有数字1.1,值没有数字1.1
True

>>> 'c' in list1   #列表中有'c',索引没有'c'
Ture

2.3、将字符串格式设置功能用于字典

  • 必须使用format_map来指出你将通过一个映射来提供所需的信息。
>>> phonebook = {'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}
>>> "Cecil's phone number is {Cecil}.".format_map(phonebook)
"Cecil's phone number is 3258."
  • 在模板系统中,这种字符串格式设置方式很有用
>>> template = '''<html>
<head><title>{title}</title></head>
<body>
<h1>{title}</h1>
<p>{text}</p>
</body>'''

>>> data = {'title': 'My Home Page', 'text': 'Welcome to my home page!'}
>>> print(template.format_map(data))
<html>
<head><title>My Home Page</title></head>
<body>
<h1>My Home Page</h1>
<p>Welcome to my home page!</p>
</body>

3、字典方法

3.1、字典方法详解

1、clear

  • 方法clear删除字典的所有项,什么都不返回(或者说返回None)。
>>> d = {}
>>> d['name'] = 'Gumby'
>>> d['age'] = 42
>>> d
{'age': 42, 'name': 'Gumby'}
>>> returned_value = d.clear()
>>> d
{}
>>> print(returned_value)
None
  •  场景一
>>> x = {}
>>> y = x    #x、y指向同一内存空间
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x = {}    #x指向新的内存空间,y依旧指向原来的内存空间
>>> y
{'key': 'value'}
  •  场景二
>>> x = {}
>>> y = x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x.clear()  #将x指向的内存空间清空,因此y也是空的
>>> y
{}

2、copy

  • 方法copy返回一个新字典,其包含的键值对与原来的字典相同(这个方法执行的是浅复制,因为值本身是原件,而非副本)。
  • 浅copy,只copy第一层,即第一层相互独立,其他层不独立。
>>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y = x.copy()

>>> y['username'] = 'mlh'
>>> y['machines'].remove('bar')
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}
  • 使用模块copy中的函数deepcopy进行深复制,即同时复制值及其包含的所有值等。
  • 深copy,生成一个完全独立的字典。
>>> from copy import deepcopy
>>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y = x.copy()
>>> z = deepcopy(x)

>>> z['username'] = 'mlh'
>>> z['machines'].remove('bar')
>>> x
{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y
{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> z
{'username': 'mlh', 'machines': ['foo', 'baz']}

>>> y['username'] = 'mlf'
>>> y['machines'].remove('foo')
>>> x
{'username': 'admin', 'machines': ['bar', 'baz']}
>>> y
{'username': 'mlf', 'machines': ['bar', 'baz']}
>>> z
{'username': 'mlh', 'machines': ['foo', 'baz']}

3、fromkeys

  • 方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None。
>>> {}.fromkeys(['name', 'age'])    #先创建了一个空字典有点多余
{'name': None, 'age': None}
>>> dict.fromkeys(['name', 'age'])   #直接调用dict类的方法fromkeys
{'name': None, 'age': None}
  • 不想使用默认值None,可提供特定的值。
>>> dict.fromkeys(['name', 'age'], '(unknown)')
{'name': '(unknown)', 'age': '(unknown)'}

4、get

  • 方法get为访问字典项提供了宽松的环境。使用key访问字典中没有的项时,将引发错误,但get方法不会。
  • 使用get来访问不存在的key时,不引发异常,而是返回None。
>>> mai = {'name':'hengha', 'age':18, 90:50}
>>> print(mai['hh'])
Traceback (most recent call last):
    File "<pyshell#198>", line 1, in <module>
        print(mai['hh'])
KeyError: 'hh'

>>> print(mai.get('hh'))
None
  • 指定“默认”值,不使用None。即如果字典有这个key,就返回其值;如果没有,就返回默认值。
>>> print(mai.get('hh','gg'))
gg

5、items

  • 方法items返回一个包含所有字典项的列表,其中每个元素都为(key, value)的形式。字典项在列表中的排列顺序不确定。
  • 返回值属于一种名为字典视图的特殊类型。字典视图可用于迭代。可确定其长度以及对其执行成员资格检查。
>>> dict1 = {'张三':88, '李四':66, '王二':100, '麻子':10}
>>> it = dict1.items()
>>> it
dict_items([('张三', 88), ('李四', 66), ('王二', 100), ('麻子', 10)])

>>> len(it)
4
>>> ('麻子', 10) in it
True
  • 视图的一个优点是不复制,它们始终是底层字典的反映。
>>> dict1['麻子'] = 11
>>> it
dict_items([('张三', 88), ('李四', 66), ('王二', 100), ('麻子', 11)])
dict1 = {'张三':88, '李四':66, '王二':100, '麻子':10}

for i in dict1:        #单独遍历字典,遍历的是key
    print(i)
print('*****************')

for i in dict1.items():
    print(i,)
print('*****************')

for key,value in dict1.items():
    if value >= 80:
        print(key)

<<<                   #结果输出 
张三
李四
王二
麻子
*****************
('张三', 88)
('李四', 66)
('王二', 100)
('麻子', 10)
*****************
张三
王二
View Code

6、keys

  • 方法keys返回一个由字典中的键组成的字典视图。
>>> dict1 = {'张三':88, '李四':66, '王二':100, '麻子':10}
>>> dict1.keys()
dict_keys(['张三', '李四', '王二', '麻子'])

7、pop

  • 方法pop可用于获取与指定键相关联的值,并将该键-值对从字典中删除。
>>> d = {'x': 1, 'y': 2}
>>> d.pop('x')
1
>>> d
{'y': 2}

8、popitem

  • 方法popitem随机删除一个字典项,因为字典项的顺序是不确定的,没有“最后一个元素”的概念。如果你要以高效地方式逐个删除并处理所有字典项,这可能很有用,因为这样无需先获取键列表。
>>> d = {'url': 'http://www.python.org', 'spam': 0, 'title': 'Python Web Site'}
>>> d.popitem()
('title', 'Python Web Site')
>>> d
{'url': 'http://www.python.org', 'spam': 0}

9、setdefault

  • 方法setdefault有点像get,因为它也获取与指定键相关联的值,但除此之外,setdefault还在字典不包含指定的键时,在字典中添加指定的键-值对。即指定的键不存在时,setdefault返回指定的值并相应地更新字典。如果指定的键存在,就返回其值,并保持字典不变。与get一样,值是可选的;如果没有指定,默认为None。
>>> d={'name': 'mai'}
>>> d.setdefault('name', 'N/A')
'mai'
>>> d.setdefault('age', 'N/A')
'N/A'
>>> d
{'name': 'mai', 'age': 'N/A'}

10、update

  • 方法update使用一个字典中的项来更新另一个字典。
  • 将通过参数提供的字典的项添加到当前字典中。如果当前字典包含键相同的项,就替换它。
>>> mai = {'name':'hengha', 'age':18, 90:50}
>>> heng = {'age':100}
>>> mai.update(heng)
>>> mai
{'name': 'hengha', 'age': 100, 90: 50}

11、values

  • 方法values返回一个由字典中的值组成的字典视图。不同于方法keys,方法values返回的视图可能包含重复的值。
>>> dict1 = {'张三':88, '李四':66, '王二':100, '麻子':10}
>>> dict1.values()
dict_values([88, 66, 100, 10])

3.2、字典方法附录

3.3、字典总结

1、添加项或修改项的值

dict1[key= value  #字典中没有此key就是添加新项,字典中有此key就是修改其值

2、查看

dick1[key]          #查看字典中键对应的值
dict1.get(key[, default])   #查看字典中键对应的值
dick1.items()         #以字典中所有的项
dick1.keys()        #以字典中所有的键
dick1.values()        #以字典中所有的值

3、删除

del dict1[key]     #删除字典中该键的项
dict1.pop(key[, d])   #删除字典中该键的项
dict1.popitem()     #随机删除字典中的项
dict1.clear()       #清空字典

posted @ 2021-01-20 21:03  麦恒  阅读(78)  评论(0编辑  收藏  举报