【Python】高级变量类型

2023-10-30

目录

​列表(List)

​编辑列表定义与结构:

​编辑列表的操作:

​元组(Tuple)

 ​编辑元组的定义:

  ​编辑元组的操作:

 ​编辑元组与格式化字符串:

 ​编辑元组和列表的转换:

​字典(dictionary)

​编辑字典的定义:

 ​编辑字典的操作:

 ​字符串(string)

​编辑字符串的定义:

​编辑字符串的操作:

 ​公共方法:

公共函数:

公共运算符:

for else循环:


Python中的数据的类型比起C语言要更加丰富,Python中不仅有常用的整型、浮点型等常用的数字类的变量,它还包含有一些非数字类型的变量,如:列表、元组、字典和字符串,其中这些非数字类型的变量还类似于C++中的容器。

列表(List)

列表定义与结构:

列表就是一连串数据组成的集合体,它类似于C语言中的数组。但是C语言中的数组一般是不能再扩大的、C语言中的数组大小是指定的,并且C语言中的数组是只能存储一种类型的数据。即只能放1、2、3的话,就不能往里面放abc,但是Python中的列表就可以存放不同的数据类型:

 列表的定义方式也如上图:左边是列表名,右边是一个中括号括起来的数据组,里面的数据元素用逗号分隔。其中列表也是类似于数组的存储方式,都是一格一格地往后存储,我们需要某个数据时只需要像访问一个数组元素一样后面跟上中括号里面是元素序号即可。重点要记住列表下标是从0开始

列表的操作:

1、取索引操作: 

所谓的取索引操作就是你得知了一个数据后,你需要知道这个数组在这个列表中的位置,那么此时我们就需要使用到取索引操作,具体只需要将你的数据作为参数传进去,那么就会返回该数据的位置。注意,如果找不到的话,它会报错。

2、 修改元素:

修改元素就是将特定位置的元素重新赋值,那么我们只需要通过下标找到元素然后重新用等号赋值即可,这里要注意,如果越界了还是会报错。

 3、添加数据:

这里往列表中添加数据又三种方法:尾插、复制列表和中间某个位置插入数据。

先来说尾插,也就是在数据的末尾追加一个新的数据,这个操作对应的是列表里的append方法,我们只需要向它传递一个插入的元素即可;而中间插入就是利用insert的方法,它的使用与append类似,只不过多了一个插入位置的参数。而最后的复制一个列表追加到原列表末尾则是利用extend方法,参数是传递一个新的需要追加的列表。

4、删除数据:

在列表中,我们删除数据的方法有三种:popclearremove。这三个删除方法都有不同,首先是clear,clear表示清空当前的列表中的所有元素,也就是说执行了clear后列表里一个元素也没有。而remove表示清除某个特定的元素,它需要清除的元素就跟在它后面的括号内部作为参数。例如列表里有1,2,3,5,8;那么我们要删除5就需要输入remove(5)即可。这里要注意,如果这个列表中包含多个5,那么remove会默认删除第一个5。而pop与remove类似,只不过它的参数是那个元素的下标号,例如我们要删除5就传进去5的下标4,即pop(4)。注意了,如果我们不给pop传参数,那么它默认删除的是最后一个元素。或者我们还有一种删除方法就是使用del关键字,它类似C语言中的free,都是表示释放了后面变量的内存空间来删除。

5、统计与长度获取

如果我们想要得到列表中的元素个数(即列表长度)或者列表中某个元素的重复次数,那么我们需要使用len算法和count方法。

 6、列表的反转与排序:

列表的反转指的是将原来的一个列表的所有元素倒过来,这里我们实现用的是reverse方法,并且不需要传递参数。 

而列表的排序我们用的则是sort方法,它的参数我们暂时只需要理下面的第三个参数reverse,因为它决定了排序后是否会再次反转,默认情况下是从小到大。如果它为假,那么默认情况下执行的排序从小到大,如果它为真,那么我们的排序顺序是从大到小

 下面的图分别就是reverse是否为真时的排序情况:

 7、列表的遍历:

列表的遍历指的是重复访问这个列表来获得这个列表里的每一个元素,其中Python中也是利用迭代器(iteration)来进行操作的。其中迭代器类似于指针,我们可以利用迭代器去访问到每一个元素。而在Python中简化了方法,直接利用for循环和自己定义的一个变量去接收每一个元素的数据,从而不用直接和迭代器打交道。

元组(Tuple)

 元组的定义:

元组也是一个类似于容器的结构,它也可以用来存储数据,类似于列表,但是元组一般都是存储一些数据类型不同的数据。元组和列表不同,元组不支持增删改数据的功能,也就是说,元组一旦被确定就不能被后续修改了,这就类似于C语言中的常量数组(const);并且元组是以小括号的形式定义的,这也与列表有出入。

Tuple = (1,2,3)

其中有一种情况需要值得我们注意,那就是当元组里只有一个元素时,因为元组定义是使用的小括号,这也与我们算术运算是用小括号容易混淆,所有如果我们要定义的元组只有一个元素时,我们需要在那个元素后面加上一个逗号来告诉解释器这是一个元组。

  元组的操作:

元组的操作是列表操作的缩减版,因为元组一旦创建不能被修改的特性,所以元组中能够使用的方法也就只有统计元素个数的count和索引元素下标的index方法。

Tuple = (1,2,1,1,1,3)
Tuple.index(1) #0
Tuple.count(1) #4

 元组与格式化字符串:

对于我们之前多个变量输出时使用的格式化字符串,其实就使用到了元组的知识。

print("%s,%d"%("e",5))

例如上面的代码,其实后面百分号跟的括号就是一个元组,我们也可以利用一个内容相同的元组的元组名去替换它,所以元组在格式化字符串表示的输出中也有很大用处。

 元组和列表的转换:

元组和列表之间也可以进行互相转换,使用的是它们之间两个函数。元组转换为列表使用list函数,其中以元组名为参数,而列表转化为元组则使用tuple函数,以列表的名为参数。它们转换完后会返回一个内容为被转换对象而类型为要转换类型的返回值。注意,不是参数转换,而是返回一个和参数内容一样的目标类型的返回值

字典(dictionary)

字典的定义:

字典也是一种存储数据的高级变量,它有点类似于C++中的map容器。它的存储方式不是按照顺序来存储的,也就是说它的内存不是连续的一块空间,而是分散的。字典中的每个数据的类型都很特殊,每个数据都是由一个键值对组成,一个键和一个值。键我们可以理解为是数据的代号,值就是我们要保存的数值。键不可以重复,只能唯一指定,而值却可以重复。这就类似于我们的身份证号码和名字。

而字典的定义方式用的是大括号{},里面的每个数值都是由键和值组成的键值对,键和值之间由冒号隔开,每个键值对之间以逗号隔开,并且每个键值对最好只占用一行代码。

dic = {0:"a",
       1:"b",
       2:"c"}
Stu_Info = {"Name":"小明",
            "ID":3121000,
            "Age":19}

 字典的操作:

对于字典的操作我们可以先掌握几个比较常用的操作,字典的操作大部分都是以中括号直接进行修改的。首先来看增加元素,增加元素我们可以直接用中括号定义一个新的键值并且赋值即可,查找和修改元素也很类似,都是通过键找到元素和进行修改即可。

dic = {0:"a",
       1:"b",
       2:"c"}
dic[键]=要修改的值
dic[3]="d"
dic[0] # 就是a

删除操作就比较不同,删除操作使用的是我们在列表中使用过的pop方法,只需在pop里面放置需要删除的键,然后就可以删除掉对应的键值对。

其次就是字典的合并功能,所谓合并,就是指将另外一个字典与已知的字典进行合并,取并集,这里要注意,如果要合并的两个字典有相同的键,那么值内容会覆盖更新

最后字典的遍历也与列表的遍历类似,只不过字典每一次遍历得到的是键的值而已,所以我们可以将临时变量的值放入字典名后的中括号里来进行访问。

 字符串(string)

字符串的定义:

字符串就是一串字符的集合体,它也是一个高级的变量,一般的字符串都是指双引号括起的内容,即我们一般用双引号来定义字符串,但是有时如果字符串内部需要有双引号,那么此时我们需要用单引号来定义字符串。

字符串与其它的高级变量一样,都是可以通过下标的方式来访问到字符串里的每一个内容。

字符串的操作:

类似于我们前面的几个高级变量,字符串内部也有很多方法供我们操作。

 1、计数、索引和获取长度:

这里的获取长度我们用的不是内部的方法,而是函数len,使用方法也是直接传入字符串参数即可获取字符串长度。而索引与计数都是向对应的方法index和count中传入子串来获取子串的位置和出现次数。

string  = "hellohhlloe"
string.index(("ell"))
string.count("e")
len(string)

2、判断类操作:

Python中对于字符串有很多的判断类操作,以is开头的方法都是判断类的操作,在这里我们只列举几个比较常用的判断操作:isspace(判断是否为空字符串)、isascii(是否为ASCII码值(中文就不是))、isupper(字符是否为大写字母)、isdecimal(是否为数字)、isdigit(是否为数字(只不过它的数字还包括Unicode的数字符号))、isnumeric(是否为数字(它可判断比前面两个都要广,它还包括中文字符))、isalpha(是否为字母)、isalnum(是否为字母和数字的组合)

3、字符串对齐:

关于字符串的对齐操作,总结起来有三个:rjust、ljust和center,它们分别表示右对齐、左对齐和中间对齐,使用时直接传递进去要在多宽的范围内对齐的参数,例如要在10格空格范围内对中那么就传递10,因为它默认对齐符号是英文空格,要是我们想改也可以自己在后面再传递一个参数。

4、替换和查找:

关于替换和查找的方法常用的有四个:find、replace、startswith和endswith。其中startswith表示是否以指定的字符串开头,如果是,则返回True,endswith则恰恰相反,判断是否以指定的字符串为结尾。

find与index的功能类似,都是在字符串中查找指定参数的子串的位置,查找到则返回子串的位置。但是与index不同,如果find查找不到,则它会返回-1,不像index会报错。

替换字符串则是用replace方法,它的第一个参数是要被替换的字符串,第二个参数是要替换上去的字符串。这里要注意,replace是不会修改字符串的,它只会返回一个被修改的新字符串,对于原字符串它不会做任何改变。

5、删除空白字符:

 删除空白字符的操作是删除指定的字符串左右两边的空白字符,注意是空白字符不仅仅是空格,空白字符也包括\t、\n等符号,所以这个操作可以用来去除掉一些换行等操作。它也是一个返回操作后字符串的而不改变原字符串的方法!!

6、字符串拆分和连接:

字符串的拆分和连接操作分别是使用到方法splitjoin。其中split表示拆分字符串,它的作用是将一个字符串以某个指定的符号作为分隔符,将字符串拆分成一个小字符串列表。例如有字符串“ab cdef bag”。我们利用split方法以字符b为分隔符,那么将会拆分成一个包含“a”、“cdef”、“ag”三个子串的列表。如果我们不指定以什么符号位分割,那么将会以任意空白符为分割,例如“abc\n eeee\n\t awdadaw”会被拆分成:“abc”、“eeee”、“ awdadaw”。注意,分隔符不保留

 而字符串的连接则使用join方法,这个方法的参数需要是一个元素为字符串列表/元组之类的。然后它会以join前面的字符串为分隔符将子串合并成一个新的字符串。例如"b".join(某个元组),那么就会合并成以b为分割的字符串。

 7、字符串切片:

所谓的字符串切片就是将字符串按顺序挑出一些内容组成新的字符串,它与前面的split不同,split是拆分出一个字符串子串组成的列表,而字符串切片拿到的是一个新的字符串。切片的使用方法是在字符串后面跟上中括号string[N1:N2:Step],第一个N1表示第一刀下去的地方,N2表示结束的地方,Step则表示步长,第一刀后后跟上步长就可以实现按间隔来切片:

 公共方法:

 公共方法指的是能够适用于所有的高级变量的函数、运算符等操作。

公共函数:

公共函数是在不导入工具包的情况下就能够直接被使用的函数,常用的函数包括有len、del、max、min等函数。len函数表示获取当前变量的元素个数;而del可以表示删除指定的容器或容器内的某个元素;而max和min分别用来求出容器内的最大值和最小值,其中在字典里它只会比较键的大小。

公共运算符:

在Python中,对于高级的变量我们也重载了一些和这些变量相对应的运算符,例如+、*等常用的符号。以一个列表为例:列表1+列表2表示将两个列表合并,而列表1 * 整型数字n表示将此列表内的元素重复n次。注意,字典是不可以进行乘操作的,因为字典的键是唯一的;而且还要值得注意的是列表的extend和append操作与列表加号运算符的关系:列表的extend表示追加一个新的列表,而append表示的是追加一个新的元素,这也就表示即使给append传进去一个列表,它也会将这个列表当成自己的一个新元素。而与这两个操作是实质性的改变列表内容不同,加号操作符不会改变列表的内容,而是返回一个新的修改后的新列表。

而关于公共的运算符还有in和not in两个成员运算符,它们用来判断某个元素是否在特定的容器内,例如有一个列表List = [0,1,2,3,4,5,6],那么如果输入 5 in List 它就会返回真,否则返回假。 

for else循环:

对于我们以前用到的for循环来说for else在其基础上在结尾增加了一个条件else,这个条件可以帮助我们判断循环是否完全完成,即如果循环是从头到尾都完成了一遍,那么else就会执行,相反,如果循环在某次循环的中途遇到break而退出了,那么else就不会执行。

未完成循环
完成循环

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】高级变量类型 的相关文章

  • 是否可以模拟 Python 3.6 中的内置 len() 函数?

    是否可以模拟内置len Python 3 6 中的函数 我有一个类定义了一个简单的方法 该方法依赖于len 函数如下 class MyLenFunc object def is longer than three characters se
  • 编辑 scikit-learn 决策树

    我想编辑 sklearn DecisionTree 例如改变条件或切割节点 叶子等 但似乎没有功能可以做到这一点 如果我可以导出到文件 编辑它以导入 如何编辑决策树 环境 Windows 10 python3 3 sklearn 0 17
  • KFold 和 ShuffleSplit CV 有什么区别?

    看起来 KFold 每次迭代对象时都会生成相同的值 而 Shuffle Split 每次都会生成不同的索引 它是否正确 如果是这样 其中一个相对于另一个有什么用处 cv cross validation KFold 10 n folds 2
  • 底图上的子图

    我有一张英国地图和 121 个地点 每个地点有 3 个值 我想绘制 121 个位置中每个位置的三个值的小条形图 目前 这些值绘制为markersize属性 看起来像这样 密集恐惧症情节 https i stack imgur com 5fv
  • 子进程改变目录

    我想在子目录 超级目录中执行脚本 我需要首先进入该子目录 超级目录 我无法得到subprocess进入我的子目录 tducin localhost Projekty tests ve python Python 2 7 4 default
  • 将 API 数据存储到 DataFrame 中

    我正在运行 Python 脚本来从 Interactive Brokers API 收集金融市场数据 连接到API后 终端打印出请求的历史数据 如何将数据保存到数据帧中而不是在终端中流式传输 from ibapi wrapper impor
  • conda 无法从 yml 创建环境

    我尝试运行下面的代码来从 YAML 文件创建虚拟 Python 环境 我在 Ubuntu 服务器上的命令行中运行代码 虚拟环境名为 py36 当我运行下面的代码时 我收到下面的消息 环境也没有被创建 这个问题是因为我有几个必须使用 pip
  • 使用 Scipy imsave 将 Numpy 数组保存到图像时保留未更改的数据

    使用 Scipy 保存二维 Numpy 数组 单个值 时toimage or imsave像素值与 Numpy 数组中的像素值不完全匹配 相反 在某些区域 主要是边缘 图像算法似乎使用某种插值 是否有一个选项可以停止插值并保留准确的数据 例
  • 为 Networkx 图添加标题?

    我希望我的代码创建一个带有标题的图 使用下面的代码 可以创建绘图 但没有标题 有人可以告诉我我做错了什么吗 import pandas as pd import networkx as nx from networkx algorithms
  • 如何修复错误“AttributeError:‘模块’对象在 python3 中没有属性‘客户端’?

    以下是我的代码 import http h1 http client HTTPConnection www bing com 我认为没问题 但是 python 给了我以下错误 AttributeError 模块 对象没有属性 客户端 我想知
  • 在Python中删除带有重音符号的字符串中的所有非字母字符

    我正在尝试使用 Python 3 7 从包含重音符号的字符串中删除所有非字母字符 空格除外 我尝试了以下方法 import re text 29 1981 4 2008 clean text re sub W d text print cl
  • 大型数据集上的 Sklearn-GMM

    我有一个很大的数据集 我无法将整个数据放入内存中 我想在这个数据集上拟合 GMM 我可以用吗GMM fit sklearn mixture GMM 重复小批量数据 没有理由重复贴合 只需随机采样您认为机器可以在合理时间内计算的尽可能多的数据
  • 如何向 SCons 构建添加预处理和后处理操作?

    我正在尝试在使用 SCons 构建项目时添加预处理和后处理操作 SConstruct 和 SConscript 文件位于项目的顶部 预处理动作 生成代码 通过调用不同的工具 gt 不知道在此预处理之后将生成的确切文件 可以创建用于决定生成哪
  • Jupyter Notebook:没有名为 pandas 的模块

    我搜索了其他问题 但没有找到任何有帮助的内容 大多数只是建议您使用 conda 或 pip 安装 pandas 在我的 jupyter 笔记本中 我试图导入 pandas import pandas as pd 但我收到以下错误 Modul
  • Spyder 如何在同一线程的后台运行 asyncio 事件循环(或者确实如此?)

    我已经研究 asyncio 模块 功能几天了 因为我想将它用于我的应用程序的 IO 绑定部分 并且我认为我现在对它的工作原理有一个合理的理解 或者在至少我认为我已经理解了以下内容 任一时刻 任一线程中只能运行一个异步事件循环 一旦一切都设置
  • 为什么 bot.get_channel() 会产生 NoneType?

    我正在制作一个 Discord 机器人来处理公告命令 当使用该命令时 我希望机器人在特定通道中发送一条消息 并向用户发送一条消息以表明该命令已发送 但是 我无法将消息发送到频道 我尝试了这段代码 import discord import
  • 最小硬币找零问题——回溯

    我正在尝试用最少数量的硬币解决硬币找零问题 采用回溯法 我实际上已经完成了它 但我想添加一些选项 按其单位打印硬币数量 而不仅仅是总数 这是我下面的Python代码 def minimum coins coin list change mi
  • 在Python中从日期时间中减去秒

    我有一个 int 变量 它实际上是秒 让我们调用这个秒数X 我需要得到当前日期和时间 以日期时间格式 减去的结果X秒 Example If X是 65 当前日期是2014 06 03 15 45 00 那么我需要得到结果2014 06 03
  • 在Python 3.2中,我可以使用http.client打开并读取HTTPS网页,但urllib.request无法打开同一页面

    我想打开并阅读https yande re https yande re with urllib request 但我收到 SSL 错误 我可以使用以下方式打开并阅读页面http client用这个代码 import http client
  • 为什么用字符串和时间增量转置 DataFrame 会转换数据类型?

    这种行为对我来说似乎很奇怪 id列 字符串 在转置后转换为时间戳df如果另一列是时间增量 import pandas as pd df pd DataFrame id 00115 01222 32333 val 12 14 170 df v

随机推荐

  • vscode链接AutoDL,并使用xtfp7传输文件

    1 AutoDL简介 AutoDL是一个GPU租赁平台 便宜好用 点击下面的链接注册即可 学生邮箱认证有优惠 4090 3090显卡都有还有3060 3080 TITAN Xp等等 AutoDL 品质GPU租用平台 租GPU就上AutoDL
  • 深度图拼接

    度量变换 图像拼接 检测深度图 国科大图像处理实验 度量变换 图像拼接 检测深度图 国科大图像处理实验 Root dobby的博客 CSDN博客 问题描述 目录hw3下有立体视觉对应的两幅图像view1 png和view5 png 图像来源
  • 家用电脑可以用做服务器吗

    家用电脑的结构与服务器的结构是相同的 家用电脑是可以用来搭建服务器使用 但使用家用电脑做服务器在稳定性会比服务器差很多 1 家用电脑没有公网IP 网络运营商分配的IP重启路由之后是会变化 不固定 服务器运行是需要有固定IP让人连接访问 使用
  • Ngui 五种点击事件实现方式

    ngui作为unity界面插件之一中 无疑是最好用 使用最多的了从自学unity到现在界面一直使用它 由于它的持续更新 我在此不得不说 确实很为开发者作想 为什么这么讲呢 大概在去年吧 当时用的那个版本已经不记得了 反正就是有个需求 要实现
  • HTC相关开发所需SDK等工具都在这里了

    HTC相关开发所需SDK等工具都在这里了 转 OpenVR SDKhttps github com ValveSoftware openvr OpenVR SDK是由原本的SteamWorks SDK更新而来 新增对HTC VIVE开发者版
  • 时间格式转换LongToString

    import java util Calendar import java util Date import org apache commons lang3 StringUtils import org apache commons la
  • 3.Qt消息机制和事件

    9 Qt消息机制和事件 好文来自https www cnblogs com weizhixiang p 5824345 html 一 事件 鼠标 敲下键盘 或者是窗口需要重新绘制的时候 都会发出一个相应的事件 Qt 程序需要在main 函数
  • 人工智能在游戏开发中的应用:你目前所需的 6 大 AI 工具

    游戏体量越大 质量越高 所要求的标准就越严格 尤其是在 AAA 级游戏市场 任何失误都可能导致你陷入极其棘手的境地 影响玩家体验 进而招致恶评 随着对游戏的需求和预期不断攀升 游戏开发人员比以往任何时候都需要更多帮助 那么 他们如何才能紧跟
  • Consumer位移管理-Kafka从入门到精通(十一)

    上篇文章说了 sesstion time out max poll interval ms max poll records和auto offset reset等参数 KafkaConsumer Kafka从入门到精通 十 https bl
  • eclipse如何创建多层包(多级包)

    包是Java中一个非常重要的概念 实质上包就是一个文件夹 我们在每次创建工程之前 要将不同的类放在不同的包里 以方便管理和避免类名重复所带来的麻烦 以后在使用其他包的类时 只需要使用 import 关键字进行包含就可以了 那么 在eclip
  • HTTPS 证书认证具体流程

  • Appium自动化框架从0到1之 日志文件配置(log.conf)

    在config文件中 我们先把log的输出格式 输出路径等参数抽离出来作为一个配置表 这个写法 在selenium自动化框架中 是没有分离的 所以 我们有get到一个新方法 代码如下 log conf loggers keys root i
  • C#中Console.WriteLine()的用法

    C 中Console WriteLine 的用法 以前用Console WriteLine 的时候就只会用它直接输出string字符串 但后来发现它还有其它在有些场合下会十分方便的输出方法 这篇就记录一下这些方法的使用吧 代码格式我就不写了
  • 向HashSet中添加元素的过程:

    向HashSet中添加元素的过程 1 当向 HashSet 集合中存入一个元素时 HashSet 会调用该对象的 hashCode 方法来得到该对象的 hashCode 值 然后根据 hashCode 值 通过某种散列函数决定该对象在 Ha
  • 微信小程序实战八:优惠券页面的实现

    文章目录 1 效果预览 2 wxml布局 3 js逻辑 4 样式设置 1 效果预览 2 wxml布局 顶部tab切换
  • cucumber ,运行feature一直提示 Undefined step: Given login baidu

    Undefined step Given login baidu You can implement missing steps with the snippets below Given login baidu public void l
  • 软件测试员必知!压力测试总共需要几个步骤?思路总结篇

    在运维工作中 压力测试是一项很重要的工作 比如在一个网站上线之前 能承受多大访问量 在大访问量情况下性能怎样 这些数据指标好坏将会直接影响用户体验 今天我们就来深入了解下压力测试 首先 什么是压力测试 软件压力测试是一种基本的质量保证行为
  • Python 实现 RAS 加解密(ras模块,pycrypto模块)

    一 pycrypto pycryptodome模块 1 模块安装说明 crypto这个模块的安装有点小坑 需要注意 crypto pycrypto pycryptodome的功能是一样的 crypto与pycrypto已经没有维护了 所以
  • uni-app开发微信小程序,textarea组件宽度设置,解决超出父级div

    问题描述 当我们使用textarea组件时 会出现设置宽度100 但其超出了父级Div 如下图 解决方案 添加box sizing border box 属性 即可完美解决 属性定义及使用说明 box sizing 属性定义如何计算一个元素
  • 【Python】高级变量类型

    目录 列表 List 编辑列表定义与结构 编辑列表的操作 元组 Tuple 编辑元组的定义 编辑元组的操作 编辑元组与格式化字符串 编辑元组和列表的转换 字典 dictionary 编辑字典的定义 编辑字典的操作 字符串 string 编辑