{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 字典的创建"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 字典(映射类型)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"字典(dict)是Python内置唯一映射数据类型(Mapping Types),是一种<font color='red'>**可变数据类型**</font>,按<font color='red'>**加入顺序**</font>存储,但<font color='red'>**不可用**</font><font color='red'>**序号索引**</font>和<font color='red'>**切片**</font>等方法。 \n",
"字典使用一对大括号“{}”来存放数据,元素之间用逗号“,”分隔。 \n",
"每个元素都是一个<font color='red'>**“键:值”(Key:Value)对**</font>,用来表示“键”和“值”的映射关系或对应关系。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"images/ch7/12.png\" style=\"zoom:50%;\">\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"不同于以固定范围的数字进行索引的序列,字典是以<font color='red'>**键**</font>进行索引的,键可以是任何<font color='red'>**不可变类型。**</font> \n",
"<font color='red'>**字符串**</font>和<font color='red'>**数字**</font>总是可以作为键。 \n",
"如果一个<font color='red'>**元组**</font>只包含字符串、数字或元组则也可以作为键;如果一个元组直接或间接地包含了<font color='red'>**任何可变对象**</font>,则不能作为键。 \n",
"<font color='red'>**列表**</font>不能作为键,因为列表可以使用索引赋值、切片赋值或者 append() 和 extend() 等方法进行原地修改列表。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"captial = {'中国':'北京', '日本':'东京', '法国':'巴黎', ['美国', 'USA']:'华盛顿'}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"字典中的<font color='red'>**键不可重复**</font>,必须是字典中独一无二的数据。如有重复,只<font color='red'>**保留最后一个元素**</font>。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"score_dict = {'python': 59.6, 'python': 60.0}\n",
"print(score_dict) # {'python': 60.0}\n",
"phone_dict = {'李明':'13988887777', '李明':'13866668888'}\n",
"print(phone_dict) # {'李明': '13866668888'}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"images/ch7/21.png\" style=\"zoom:50%;\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"数字类型用作键时遵循数字比较的一般规则: \n",
"**如果两个数值相等 (例如 1 和 1.0) 则两者被认为是同一个键。**。 \n",
"但计算机内部存储浮点型数据时是非精确值,建议字典的**键尽可能不使用浮点型数据**。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"num_dict = {1: 100, 1.0: 1000}\n",
"print(num_dict) # {1: 1000}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"images/ch7/22.png\" style=\"zoom:50%;\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"字典的值可以是任意类型的数据,也可以重复。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"字典的主要用途是通过关键字存储、提取值。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 字典的创建"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 创建空字典"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"创建一个不包含任何值的空字典,使用以下方法中的一种:\n",
"1. 将**一对空的大括号**赋值给一个对象的方法创建空字典;\n",
"2. 用**dict()函数不加任何参数**来创建空字典。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"D1 = {} # 使用一对不包含任何数据的“{}”创建一个空字典数据\n",
"D2 = dict() # 使用字典构造器创建一个空字典数据\n",
"print(D1,D2) # 输出:{} {}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"images/ch7/23.png\" style=\"zoom:50%;\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"+ ##### 创建非空字典\n",
"\n",
"\n",
"1. 将用大括号界定的多个包含键值对的元素赋值给一个对象"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'name': '张三', 'age': 19, 'gender': 'M'}\n"
]
}
],
"source": [
"D1 = {\"name\": '张三', 'age': 19, 'gender': 'M'} \n",
"print(D1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"2. 使用字典构造器dict(),给键名赋值(创建映射),创建字典,注意:此处的**键名不加引号**。这种方法<font color='red'>**不能**</font>创建以Python<font color='red'>**关键字**</font>为字符串的键,如 'for'。"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'name': '张三', 'age': 19, 'gender': 'M'}\n"
]
}
],
"source": [
"D2 = dict(name = '张三', age = 19, gender = 'M')\n",
"print(D2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"3. 使用字典构造器dict(),参数必须为一个<font color='red'>**可迭代对象**</font>,该可迭代对象中的每个元素本身必须为一个刚好包含<font color='red'>**两个元素**</font>的可迭代对象。 每一元素中的第一个元素将成为新字典的一个键,第二个元素将成为其对应的值。"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'name': '张三', 'age': 19, 'gender': 'M'}\n"
]
}
],
"source": [
"D3 = dict([('name', '张三'), ('age', 19), ('gender', 'M')])\n",
"\n",
"print(D3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"4. 使用字典构造器<font color='red'>**无序**</font>dict()结合内置<font color='red'>**zip()函数**</font>。zip()函数可产生一个可迭代对象,该可迭代对象中的每个元素本身为一个刚好包含两个元素的可迭代对象。"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'name': '张三', 'age': 19, 'gender': 'M'}\n"
]
}
],
"source": [
"D4 = dict(zip(('name','age','gender'), ('张三',19,'M')))\n",
"print(D4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"以上这4种方法都将创建以下字典:\n",
"```python\n",
"{'name': '张三', 'age': 19, 'gender': 'M'}\n",
"```\n",
"<img src=\"images/ch7/24.png\" style=\"zoom:50%;\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"+ ##### 使用dict.fromkeys(iterable\\[, value\\])创建字典\n",
"\n",
"参数iterable是字典键的可迭代对象,value是可选参数, 设置键序列(iterable)的值。这里的**value只能是一个值**,可以是数字、字符串、列表或字典等,但只能是一个元素。该方法返回一个新字典,每个键具有相同的值,**当value缺省时,值为None**。\n",
"此种方法可根据已有键序列,快速创建一个包含相同值的字典。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"course = ('Python','Java', 'C')\n",
"score1 = dict.fromkeys(course) # value缺省,值均为None\n",
"print(score1) # {'Python': None, 'Java': None, 'C': None}\n",
"score2 = dict.fromkeys(course,60) # 值均为60\n",
"print(score2) #{'Python': 60, 'Java': 60, 'C': 60}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"images/ch7/25.png\" style=\"zoom:50%;\">\n",
"\n",
"+ ##### 使用字典推导式快速的生成字典数据序列"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"phone_ls = [('李明','13988887777'), ('张宏','13866668888'), ('吕京','13143211234')]\n",
"dict1 = {k:v for k,v in phone_ls} # 用推导式从列表生成字典\n",
"print(dict1) #输出{'李明': '13988887777', '张宏': '13866668888', '吕京': '13143211234'}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"https://www.educoder.net/api/attachments/3392469?type=image/png\" style=\"zoom:50%;\">"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}