字典

# -*- coding: utf-8 -*-
# @Time    : 2019/11/7 14:23
# @Author  : John
# @Email   : 2398344557@qq.com
# @File    : 字典.py
# @Software: PyCharm
import string
  • 字典包含若干键值对的无序可变的序列
  • 字典中的键可以为任意的不可变的数据,比如number、string、tuple
  • 创建字典
# 空字典
# 创法一:
d1 = {}
print(d1)
# —— {}
print(type(d1))
# —— <class 'dict'>
# ------------
# 创法二:
d2 = dict()
print(d2)
# —— {}
print(type(d2))
# —— <class 'dict'>
# --------------------------
# # ***拓展***

# 空列表
l = []
print(type(l))
# # —— <class 'list'>
# ------------
# 空元组
t = ()
print(type(t))
# # —— <class 'tuple'>
d = {'server': 'db.neuedu.com', 'database': 'oracle'}
print(type(d))
# —— <class 'dict'>
print(d)
# —— {'server': 'db.neuedu.com', 'database': 'oracle'}
  • 使用dict函数将已有数据转化为字典
# 1. 使用ip()对两个列表进行重组
keys = [x for x in string.ascii_lowercase[:5]]
print(keys)
# —— ['a', 'b', 'c', 'd', 'e']
values = [i for i in range(1, 6)]
print(values)
# —— [1, 2, 3, 4, 5]
print(dict(zip(keys, values)))
# —— {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

# 2. 使用dict(),根据给定的键值创建
d3 = dict(name='xuebi', age=20, gender='female')
print(d3)
# —— {'name': 'xuebi', 'age': 20, 'gender': 'female'}

# 3. 根据给定的内容为键,创建值为空的字典
# dict.fromkeys(seq)    # seq为可迭代对象
print(dict.fromkeys(['name', 'age', 'gender']))
# —— {'name': None, 'age': None, 'gender': None}
  • 字典的读取
# 以键为下标读取字典,不存在键时抛出异常
# 格式:字典名['键']
d3 = dict(name='xuebi', age=20, gender='female')
print(d3['name'])
# —— xuebi
# print(d3['addr'])    # 不存在addr键,因此抛出异常
# —— KeyError: 'addr'
# ***拓展***
# 解决方法;使用字典的get方法获取指定键对应的值,并且可以为不存在的键指定默认返回值
print(d3.get('name'))
# —— xuebi
# print(d3.get('addr'))
# —— None
print(d3.get('addr', '广东鹤山'))
# —— 广东鹤山
  • 获取字典所有的键,返回包含这个字典所有键的列表
d3 = dict(name='xuebi', age=20, gender='female')
print(d3.keys())
# —— dict_keys(['name', 'age', 'gender'])
print(list(d3.keys()))    # 返回列表
# —— ['name', 'age', 'gender']
  • 获取字典所有的值,返回包含这个字典所有值的列表
d3 = dict(name='xuebi', age=20, gender='female')
print(d3.values())
# —— dict_values(['xuebi', 20, 'female'])
print(list(d3.values()))    # 返回列表
# —— ['xuebi', 20, 'female']
  • 获取字典所有的键值,返回包含这个字典所有键值的列表
d3 = dict(name='xuebi', age=20, gender='female')
print(d3.items())
# —— dict_items([('name', 'xuebi'), ('age', 20), ('gender', 'female')])
print(list(d3.items()))    # 返回列表+元组
# —— [('name', 'xuebi'), ('age', 20), ('gender', 'female')]
print(dict(list(d3.items())))    # 打回原形(变回字典)
# —— {'name': 'xuebi', 'age': 20, 'gender': 'female'}
  • 字典的修改
# 格式:字典名['键']='新的值'
d3 = dict(name='xuebi', age=20, gender='female')
# print(d3['gender']='male')
# —— SyntaxError: keyword can't be an expression
# d3 = d3['gender']='male'
# print(d3)
# —— TypeError: 'str' object does not support item assignment
d3['gender']='male'
print(d3)
# —— {'name': 'xuebi', 'age': 20, 'gender': 'male'}
  • 字典的添加
# 格式:字典名['字典中不存在的键']='新的值'
# 当字典中存在这个键时进行赋值时是修改操作
# 反之,当不存在时,会进行添加
d3 = dict(name='xuebi', age=20, gender='female')
d3['addr']='湛江市赤坎区'
print(d3)
# —— {'name': 'xuebi', 'age': 20, 'gender': 'female', 'addr': '湛江市赤坎区'}
d3['phone']='7533'
print(d3)
# —— {'name': 'xuebi', 'age': 20, 'gender': 'female', 'addr': '湛江市赤坎区', 'phone': '7533'}
  • 字典的删除
# 1. del可以删除整个字典,或者其中的指定元素
# del d3    # 整个字典被完全删除,连名字都没了
d3 = {'name': 'xuebi', 'age': 20, 'gender': 'female', 'addr': '湛江市赤坎区', 'phone': '7533'}
# print(d3)
# —— NameError: name 'd3' is not defined
# 根据键删除整个元素
del d3['phone']
print(d3)
# —— {'name': 'xuebi', 'age': 20, 'gender': 'female', 'addr': '湛江市赤坎区'}、

# 2. 字典名.clear()    删除字典的所有数据
d3 = {'name': 'xuebi', 'age': 20, 'gender': 'female', 'addr': '湛江市赤坎区', 'phone': '7533'}
d3.clear()    # 还是一个空字典
print(d3)
# —— {}

# 3. 字典名.pop()    删除指定键所对应的值,返回整个值并且从字典中把它移除
d3 = {'name': 'xuebi', 'age': 20, 'gender': 'female', 'addr': '湛江市赤坎区', 'phone': '7533'}
# ret = d3.pop()
# print(ret)
# —— TypeError: pop expected at least 1 arguments, got 0
ret = d3.pop('addr')
print(ret)
# —— 湛江市赤坎区
print(d3)
# —— {'name': 'xuebi', 'age': 20, 'gender': 'female', 'phone': '7533'}
# -----------------------------
# ***拓展***
# 字典名.popitem()    按照后进先出的顺序返回并删除字典的最后的键值对
d3.popitem()
print(d3)
# —— {'name': 'xuebi', 'age': 20, 'gender': 'female'}
d3.popitem()
print(d3)
# —— {'name': 'xuebi', 'age': 20}
d3.popitem()
print(d3)
# —— {'name': 'xuebi'}
d3.popitem()
print(d3)
# —— {}
# d3.popitem()
# print(d3)
# —— KeyError: 'popitem(): dictionary is empty'
  • 判断一个key是否在列表中
d3 = {'name': 'xuebi', 'age': 20, 'gender': 'female', 'addr': '湛江市赤坎区', 'phone': '7533'}
print('name' in d3.keys())
# —— True
print('name' in d3)
# —— True
print('name' not in d3)
# —— False
  • 字典的遍历
d3 = {'name': 'xuebi', 'age': 20, 'gender': 'female', 'addr': '湛江市赤坎区', 'phone': '7533'}
# 遍历字典所有的键
for key in d3.keys():
    print(key)
# —— name
# age
# gender
# addr
# phone
# 遍历字典所有的值
for value in d3.values():
    print(value)
# —— xuebi
# 20
# female
# 湛江市赤坎区
# 7533
# 遍历字典所有的项
for key_value in d3.items():
    print(key_value)    # 返回的是一个元组
# —— ('name', 'xuebi')
# ('age', 20)
# ('gender', 'female')
# ('addr', '湛江市赤坎区')
# ('phone', '7533')
# 遍历字典所有的键值
for key, value in d3.items():
    print(key, '---->', value)
# —— name ----> xuebi
# age ----> 20
# gender ----> female
# addr ----> 湛江市赤坎区
# phone ----> 7533
  • 字典推导式(字典解析)
# {key:value for 临时变量 in 可迭代对象 if 条件}
from random import randint
grade = {'student{}'.format(x): randint(0, 100) for x in range(1, 11)}
print(grade)
# —— {'student1': 34, 'student2': 69, 'student3': 21, 'student4': 24, 'student5': 18, 'student6': 23, 'student7': 26, 'student8': 84, 'student9': 20, 'student10': 32}
  • 筛选大于60分成绩的学生
# 1. 普通做法:
jige = {}
for k,v in grade.items():
    if v > 60:
        jige[k]=v
print(jige)
# —— {'student2': 69, 'student8': 84}

# 2. 使用字典推导式(字典解析)
jige2 = {k:v for k,v in grade.items() if v>60}
print(jige2)
# —— {'student2': 69, 'student8': 84}

# jige3 = {'student{}'.format(x): randint(0, 101) for x in range(1, 11) if randint(0, 100)>60}
# print(jige3)
# —— 小老弟,这方法不行
  • 用字典推导式以字符串以及其索引位置建立字典
strings = ['import', 'is', 'with', 'if', 'file', 'exception', 'liuhu']
# 1、
print({val: index for index, val in enumerate(strings)})
# —— {'import': 0, 'is': 1, 'with': 2, 'if': 3, 'file': 4, 'exception': 5, 'liuhu': 6}
# 2、
print({strings[i]: i for i in range(len(strings))})
# —— {'import': 0, 'is': 1, 'with': 2, 'if': 3, 'file': 4, 'exception': 5, 'liuhu': 6}
# 3、
print({v: len(v) for v in strings})
# —— {'import': 6, 'is': 2, 'with': 4, 'if': 2, 'file': 4, 'exception': 9, 'liuhu': 5}
  • 把同一个字母但不同大小写的值合并起来
mc = {'a': 10, 'b': 34, 'A': 8, 'Z': 3}
# 把全部英文字母改成小写后再合并
print({k.lower(): mc.get(k.lower(), 0)+mc.get(k.upper(), 0) for k in mc.keys()})
# —— {'a': 18, 'b': 34, 'z': 3}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容