0%

15、字典.md

一、概要

字典是Python语言中唯一的映射类型。在其他语言里例如在c语言里叫 联合内存 ( associative memories )在JavaScript里 联合数组 ( associative arrays ),在java里就是通常所说的map。

序列是以连续的整数为索引,与此不同的是,字典以 key为索引,key可以是任意不可变类型,通常用字符串或数值。如果元组中只包含字符串和数字,它可以做为key,如果它直接或间接的包含了可变对象,就不能当做key。不能用列表做关键字,因为列表可以用索引、切割或者 append()extend() 等方法改变

理解字典的最佳方式是把它看做无序的键: 值对 (key:value 对)集合,键必须是互不相同的(在同一个字典之内)。一对大括号创建一个空的字典: {} 。初始化列表时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式

二、定义字典

  1. 语法格式

    1
    2
    dict1 = {}
    dict1 = {key1:value1,key2:value2,...}
  2. 构造方法

    1
    2
    dict2 = dict()  # 用函数
    dict2 = dict(seq)
  3. 结构图

  4. 说明

    • 用大括号声明
    • 键与值用冒号“:”分开;
    • 元素与元素用逗号“,”分开;
    • 字典键key可以是任意不可变类型,通常是数字、字符串甚至是元组,使用格式一创建的字典的时候key可以不唯一(不唯⼀,取最后⼀个值,不建议这样写),使用格式二创建的时候 key必须唯一
    • 值可以是任意类型
  5. 示例代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #格式一初始化
    user = {'name': 'laowang', 'age': 18, 'sex': '男', 'email': '123@163.com'}
    #格式二初始化
    user =dict({name='laowang', age=18, sex=男, email='123@163.com'}) #3.6不支持
    #值其它复杂类型
    user =dict({name=['1',2,'hehe'], age=18, sex=男, email='123@163.com'}) #3.6不支持

    user =dict(address=('北京市','深圳市','武汉市','长沙市'), age=18, sex='男', email='123@163.com')
    #键不唯一 取最后一个
    user = {ame='呵呵',address=('北京市','深圳市','武汉市','长沙市'),address='上海'}
    user =dict({name='呵呵',address=('北京市','深圳市','武汉市','长沙市',address='上海')})
    #错误的写法
    print(user.get('address'))

三、获取键值

  1. 语法格式一

    1
    dict[key]
  2. 方法

    1
    dict.get(key, default=None)
  3. 说明

    通过字典的key取值或者get方法

  4. 参数

    • key

      字典中要查找的键。

    • default

      如果指定键的值不存在时,返回该默认值值。

  5. 返回值

    返回指定键的值,如果值不在字典中返回默认值None

  6. 注意事项

    通过方式一如果获取不存在的键的值就会触发的一个KeyError异常,

    可以使用字典get方法更加安全的获取字典

  7. 示例代码

    1
    2
    3
    4
    5
    6
    user =dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
    print(user['name'])
    print(user['aaa']) #直接抛出异常
    print(user.get('address'))#输出元组
    print(user.get('aaa')) #输出None
    print(user.get('aaa','name'))#dict.get(key, default=None)则如果不存在则返回一个默认值,如果设置了则是设置的,否则就是None
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    In [22]: user =dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='12 3@163.com')

    In [23]: user['name']
    Out[23]: '呵呵'

    In [24]: user['aaa']
    ---------------------------------------------------------------------------
    KeyError Traceback (most recent call last)
    <ipython-input-24-d3b16260a8cd> in <module>()
    ----> 1 user['aaa']
    KeyError: 'aaa'

四、添加

  1. 说明

    向字典添加元素,添加元素的方式有两种一种是使用,通过dict[键]=值的方式,但当key存在的时候就是修改的操作

    另外一种调用内置方法

  2. 语法格式

    1
    dict[key] = value
  3. 方法

    1
    dict.setdefault(key, value=None)
  4. 注意

    通过setdefault方法只能设置在key不存在的时候才会往字典中添加元素,但如果key已经存在了就不会做任何操作

  5. 示例代码

    1
    2
    3
    4
    In [1]: d = {}
    In [2]: d['name'] = "python"
    In [3]: d
    Out[3]: {'name': 'python'}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    In [4]: d.setdefault('age',18)
    Out[4]: 18

    In [5]: d
    Out[5]: {'name': 'python', 'age': 18}

    In [6]: d.setdefault('age',19)
    Out[6]: 18
    # age 不是19而是是18说明没有设置成功
    In [7]: d
    Out[7]: {'name': 'python', 'age': 18}

五、修改

  1. 语法格式

    1
    dict[key] = value
  2. 方法

    1
    dict.update(dict2)
  3. 说明

    当key存在的时候可以通过dict[key] = value方式修改元素

  4. 参数说明

    • dict2

      添加到指定字典dict或者可迭代对象到字典中

  5. 示例代码

    1
    2
    3
    4
    5
    user= dict()
    user['name'] = '空空'
    user['age'] = 18
    user[1] = 2
    print(user)
    1
    2
    3
    4
    5
    6
    7
    user= dict()
    user1=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
    user.update(user1)
    user.update(phone='110',state=1)#推荐写法
    # 或者
    user.update({phone:'110',state:1})
    print(user)

六、字典删除

  1. 语法格式一(不推荐)

    1
    2
    del dict[key] 
    #无返回值
  2. 方法

    1
    dict.pop(key[,default])
  3. 说明

    删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。如果key不存在直接报错

  4. 参数

    • key:

      要删除的键值

    • default:

      如果key不存在,返回 default 值

  5. 返回值

    返回被删除的值

  6. 示例代码

    1
    2
    3
    4
    5
    user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
    del user['name']
    print(user)
    #输出
    {'address': ('北京市', '深圳市', '武汉市', '长沙市'), 'age': 18, 'sex': '男', 'email': '123@163.com'}
    1
    2
    3
    4
    5
    6
    7
    user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
    name = user.pop('name')
    print(name) #输出 '呵呵'
    key = user.pop('sex','test') #字典存在,返回'男'
    print(key) # '男'
    key = user.pop('key','111') #字典不存在,返回'111'
    print(key)# '111'

七 、遍历所有的key

  1. 语法格式

    1
    dict_keys = dict.keys()
  2. 说明

    获取所有的key

  3. 返回值

    以列表返回一个字典所有的键

  4. 示例代码

    1
    2
    3
    4
    user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
    user_keys = user.keys()
    for user_key in user_keys:
    print(user_key)

八、遍历所有的value

  1. 方法

    1
    dict_values = dict.values()
  2. 说明

    以列表返回字典中的所有值

  3. 返回值

    返回字典中的所有值

  4. 示例代码

    1
    2
    3
    4
    user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
    dict_values = user.values()
    for value in dict_values:
    print(value)

九、遍历所有的key和value

  1. 方法

    1
    dict_items = dict.items()
  2. 说明

    以列表返回可遍历的(键, 值) 元组数组

  3. 返回值

    返回可遍历的(键, 值) 元组数组。

  4. 注意事项

    字典元素的顺序通常没有定义。换句话说,迭代的时候,字典中的键和值都能保证被处理,但是处理顺序不确定。如果顺序很重要的话,可以将键值保存在单独的列表中,例如迭代前进行排序

  5. 示例代码

    1
    2
    3
    4
    5
    6
    7
    user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')

    user_item = user.items()

    print(user_item)

    #dict_items([('name', '呵呵'), ('address', ('北京市', '深圳市', '武汉市', '长沙市')), ('age', 18), ('sex', '男'), ('email', '123@163.com')])
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
    user_items = user.items()
    for key, value in user_items:
    print("%s=" % key, value)
    #输出
    name= 呵呵
    address= ('北京市', '深圳市', '武汉市', '长沙市')
    age= 18
    sex= 男
    email= 123@163.com
    1
    2
    3
    4
    5
    6
    7
    user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
    user_items = user.items()
    keys=[]
    values=[]
    for key, value in user_items:
    keys.append(key)
    values.append(value)
  6. 练习

    编写字典程序:

    • 用户添加单词和定义
    • 查找这些单词
    • 如果查不到,请让用户知道
    • 循环
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    dictionary = {}
    flag = 'a'
    pape = 'a'
    off = 'a'
    while flag == 'a' or 'c':
    flag = input("添加或查找单词 ?(a/c)")
    if flag == "a": # 开启
    word = input("输入单词(key):")
    defintion = input("输入定义值(value):")
    dictionary[str(word)] = str(defintion) # 添加字典
    print("添加成功!")
    pape = input("您是否要查找字典?(a/0)") # read
    if pape == 'a':
    print(dictionary)
    else:
    continue
    elif flag == 'c':
    check_word = input("要查找的单词:") # 检索
    for key in sorted(dictionary.keys()): # yes
    if str(check_word) == key:
    print("该单词存在! ", key, dictionary[key])
    break
    else: # no
    off = 'b'
    if off == 'b':
    print("抱歉,该值不存在!")
    else: # 停止
    print("error type")
    break

十、其它方法

1、fromkeys

  1. 说明

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

  2. 方法

    1
    dict.fromkeys(seq[, value])
  3. 参数

    • seq – 字典键值列表。
    • value – 可选参数, 设置键序列(seq)的值
  4. 返回值

    字典对象

  5. 举个栗子

    1
    2
    3
    4
    li = [1, 2, 3]
    dict = dict.fromkeys(li)
    # 带默认值
    dict=dict.fromkeys(li,'默认值')

2、popitem

  1. 说明

    方法随机返回并删除字典中的键值对

  2. 方法

    1
    popitem()
  3. 返回值

    键值对的元组形式

  4. 示例代码

    1
    2
    3
    In [1]: dict_num = {'a':1,'b':2,'c':3}
    In [2]: dict_num.popitem()
    Out[2]: ('c', 3)

3、copy

  1. 说明

    复制一个字典

  2. 方法

    1
    dict.copy()
  3. 示例代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    In [3]: dict_num = {'a': 1, 'b': 2, 'c': 3}

    In [4]: copy_dict= dict_num.copy()

    In [5]: copy_dict
    Out[5]: {'a': 1, 'b': 2, 'c': 3}

    In [8]: id(dict_num)
    Out[8]: 4537223856

    In [7]: id(copy_dict)
    Out[7]: 4537295712

4、clear

  1. 说明

    删除字典内所有元素

  2. 方法

    1
    dict.clear()
  3. 示例代码

    1
    2
    3
    4
    In [3]: dict_num = {'a':1,'b':2,'c':3}
    In [9]: dict_num.clear()
    In [10]: dict_num
    Out[10]: {}

十一、字典推导

  1. 说明

    用来快速简洁创建一个新的字典

  2. 语法格式

    1
    dic = {key: value for (key, value) in iterable [if 条件表达式}
  3. 举个栗子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 案例1
    num_dict= {key: str(key) for key in range(10)}
    print(num_dict)

    # 案例2
    fruit = ['apple', 'banana', 'orange']
    '''
    enumerate在字典上是枚举、列举的意思
    对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),
    enumerate将其组成一个索引序列,
    利用它可以同时获得索引和值
    enumerate多用于在for循环中得到计数,也可指定开始索引
    '''
    dict_result = {key: value for key, value in enumerate(fruit) if len(value) > 5}
    print(dict_result)

    # 案例3 合并key的大小写
    user = {'Name': '赵丽颖', 'age': 18, 'name': '冯提莫', 'Test': 3, 'test': '呵呵'}
    for k in user.keys():
    new_user = {k.lower(): str(user.get(k.lower(), 0)) + str(user.get(k.upper(), 0)) for k in user.keys()}
    print(new_user)

十二、字典与序列区别

  1. 存取和访问数据的方式不同。
  2. 序列类型只用数字类型的键(从序列的开始按数值顺序索引);
  3. 字典类型可以用其他对象类型作键(如:数字、字符串、元祖,一般用字符串作键),和序列类型的键不同,字典类型的键直接或间接地和存储数据值相关联。
  4. 字典类型中的数据是无序排列的。这和序列类型是不一样的,序列类型是以数值序排列的。
  5. 字典类型用键直接“映射”到值。

十三、练习

1、实现通讯录功能

  1. 查询联系人
  2. 添加联系人
  3. 更新联系人
  4. 删除联系人
  5. 退出程序

2、示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
contacts = {}  # 定义通讯录
while 1:
temp = input('请输入指令代码:')
if not temp.isdigit():
print("输入的指令错误,请按照提示输入")
continue
item = int(temp) # 转换为数字
if item == 4:
print("|---感谢使用通讯录程序---|")
break
name = input("请输入联系人姓名:")
if item == 1:
if name in contacts:
print(name, ':', contacts[name])
continue
else:
print("该联系人不存在!")
if item == 2:
if name in contacts:
print("您输入的姓名在通讯录中已存在-->>", name, ":", contacts[name])
is_edit = input("是否修改联系人资料(Y/N):")
if is_edit == 'Y':
phone = input("请输入电话号码:")
contacts[name] = phone
print("修改成功")
continue
else:
continue
else:
phone = input("请输入联系人电话:")
contacts[name] = phone
print("添加成功!")
continue
if item == 3:
if name in contacts:
del contacts[name]
print("删除成功!")
continue
else:
print("联系人不存在")

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
dic = {}  # 定义通讯录字典
while 1:
print("1. 查询联系人 2.添加联系人 3.更新联系人 4.删除联系人 5.退出程序")
tmp = input("请输入你的选择: ")
if not tmp.isdigit():
print("你输入的值有误,请重新输入:")
tmp = int(tmp)
if tmp == 5:
print("|---感谢使用通讯录程序---|")
break
if tmp == 4:
name = input("请输入名字: ")
del dic[name]
print("已经删除")
if tmp == 1:
name = input("请输入名字: ")
if name in dic.keys():
print(name, ":", dic[name])
continue
else:
print("联系人不存在")
if tmp == 2:
name = input("请输入名字: ")
phone = input("请输入手机号: ")
dic[name] = phone
print(dic[name])
if tmp == 3:
name = input("请输入名字: ")
phone = input("请输入手机号: ")
dic[name] = phone