• Python数据类型篇(二)


    本章内容

    1. 字符串(String)
    2. 元组(Tuple)
    3. 列表(List)
    4. 字典(Dictionary)
    5. 集合(Sets)

     前言

      这一篇专讲 str、tuple、list、dict、set。这样写对于新手是比较有好处的,因为这一类操作复杂(或者说操作多)的数据类型,操作之间存在着相同点(占多比例)和不同点。要想学好python,最基本的数据类型一定要深入掌握。

      工具:Python shell 3.x 和 pycharm  版本:3.x

    一、字符串

      字符串的使用需要用引号括起来,例如:name = "Lyon";这里name就是一个变量名,而引号里面的 Lyon 则就是变量,该值的类型为 " str" 类型。这就是字符串!

      当然如上使用的是双引号,这里其实还可以使用单引号 “ 'Lyon' ” 以及三引号 “ '''Lyon''' ” (或者是"""Lyon""",单引号双引号都可以)。不过对于三引号,我们通常是表示多行字符串,这样我们就不需要利用 " " (换行符)来进行每一行的换行了。

      字符串操作:这是一个重点,对于字符串操作我们应该熟练的掌握。

      字符串操作有哪些呢?主要有 拷贝(复制)、拼接、查找、比较、统计、切片、测试、大小写等。我们需要掌握一些比较重要的,当然其他的就自己去学习吧!

      在开始详细了解这些操作之前,我们需要记住一个性质:字符串是不可变的,不可变啊不可变!那么你就会问了,既然不可变那么下面的操作是 玩捏?放风筝捏?想知道?操作都掌握了再告诉你。

      1.拷贝(复制)

    1 >>> a = "Lyon"
    2 >>> b = a
    3 >>> print(a,b)
    4 Lyon Lyon

      2.拼接

    1 >>> a = "Hello"
    2 >>> b = "Lyon"
    3 >>> print(a+b)
    4 HelloLyon

      注:这个方法要特别说明一下,“+”是一个坑,因为使用加号连接2个字符串会调用静态函数string_concat(register PyStringObject *a,register PyObject *b),这个函数大致的作用呢,就是首先开辟一块a+b大小的内存的和的存储单元,然后把a和b都拷贝进去。一个“+”就是一次啊!那n个字符串拼接,那就是n-1次啊!你想想这玩意在你电脑里面做这些无聊的事情还占你内存,要是我上去就是一大嘴巴子!

    1 >>> a = "Lyon"
    2 >>> b = "Hello"
    3 >>> print(a.join(b)) 
    4 HLyoneLyonlLyonlLyono  #HLyon eLyon lLyon lLyon o

      可以用join来将list中的元素进行拼接成字符串:' '.join( list )    即以空字符串连接列表中的每一个元素。

      注:.join():连接2个字符串,可以指定连接符号(符号?你把"Hello"改成“****”(符号)自己试试)

      3.查找

     1 >>> name = "Lyon"
     2 >>> name.index('L')   #"L"在"Lyon"的第几个?答案是第一个!
     3 0       #那他怎么返回0?因为0就是第一个,下标索引以0开始,列表里我们还能再见!
     4 >>> name.index('N')    #如果name里面没有就会报错
     5 Traceback (most recent call last):
     6   File "<stdin>", line 1, in <module>
     7 ValueError: substring not found   #自己翻译一下,要学会看错误。    

      4.比较

      本来呢,python中有个str.cmp方法来比较两个对象,并根据结果返回一个整数。整数的征服就是数值的大小了。但是在python3中就没有这个方法了,官方文档如下:

    The cmp() function should be treated as gone, and the __cmp__() special method is no longer supported. Use __lt__() for sorting, __eq__() with __hash__(), and other rich comparisons as needed. (If you really need the cmp() functionality, you could use the expression (a > b) - (a < b) as the equivalent for cmp(a, b).)

      大致的意思呢就是cmp()函数已经走了,如果你真的需要cmp函数,你可以用表达式(a>b)-(a<b)代替cmp(a,b),看下面2.7的代码:

    1 >>> a = "100"
    2 >>> b = "50"
    3 >>> cmp(a,b)   #a>b  负数
    4 -1
    5 >>> cmp(b,a)   #b<a  正数
    6 1

      在python3中呢,你还可以吧字符串转换成数字再来进行比较哦。

      5.统计

    1 >>> name = "Lyon"
    2 >>> name.count("L")      #name中"L"的个数
    3 1

      6.切片

    1 >>> name = "i like Lyon"
    2 >>> name[7:10]     #不包括10哦
    3 'Lyo'
    4 >>> name = "i like Lyon"
    5 >>> name[7:11]
    6 'Lyon'

      注:对于切片的问题啊,这里不多讲,到列表再详细的讲,因为啊,列表里面也有切片,而且跟字符串是一样的用法哦。而且切片博大精深!

      7.检测

     1 >>> name = "Lyon"
     2 >>> "L" in name     #检测"L"是否在name中,返回bool值
     3 True
     4 >>> num = "3412313"
     5 >>> num.isdigit()    #检测num里面是否全都是整数(浮点数都不行)
     6 True
     7 >>> name = "Lyon"
     8 >>> name.isidentifier() #检测name是否可以被当作标标志符,即是否符合变量命名规则 
     9 True 
    10 >>> name.find('L')    #检测name里面有没有"L"啊,有就返回index同样从0开始
    11 0
    12 >>> name.find('N')   #检测name里面有没有"N"啊,没有就返回-1
    13 -1    

      还有以下方法哦,就不一一举例了。

    1 str.startswith(prefix[,start[,end]]) #是否以prefix开头 
    2 str.endswith(suffix[,start[,end]]) #以suffix结尾 
    3 str.isalnum()    #是否全是字母和数字,并至少有一个字符 
    4 str.isalpha()    #是否全是字母,并至少有一个字符 
    5 str.isdigit()    #是否全是数字,并至少有一个字符 
    6 str.isspace()    #是否全是空白字符,并至少有一个字符 
    7 str.islower()    #S中的字母是否全是小写 
    8 str.isupper()    #S中的字母是否便是大写 
    9 str.istitle()    #S是否是首字母大写的

      注:结果全是bool值哟。

      8.大小写

     1 >>> name = "I am Lyon"
     2 >>> name.swapcase()   #大小写互换
     3 'i AM lYON'
     4 >>> name.capitalize()     #首字母大写,其它都小写
     5 'I am lyon'
     6 >>> name.upper()          #转换为大写
     7 'I AM LYON'
     8 >>> name.lower()           #转换为小写
     9 'i am lyon'

      9.更多

     1 str.ljust(width,[fillchar])     #输出width个字符,str左对齐,不足部分用fillchar填充,默认的为空格。
     2  
     3 str.rjust(width,[fillchar]) #右对齐 
     4 
     5 str.center(width, [fillchar]) #中间对齐 
     6 
     7 str.zfill(width) #把str变成width长,并在右对齐,不足部分用0补足
     8 
     9 str.replace(oldstr, newstr, [count])    #把str中的oldstar替换为newstr,count为替换次数。这是替换的通用形式,还有一些函数进行特殊字符的替换 
    10 
    11 str.strip([chars])    #把str中前后chars中有的字符全部去掉,可以理解为把str前后chars替换为None 
    12 
    13 str.lstrip([chars])    #把str前面的去掉
    14 
    15 str.rstrip([chars])    #把str后面的去掉
    16 
    17 str.expandtabs([tabsize])    #把str中的tab字符替换没空格,每个tab替换为tabsize个空格,默认是8个
    18 
    19 str.split([sep, [maxsplit]])    #以sep为分隔符,把str分成一个list。maxsplit表示分割的次数。默认的分割符为空白字符 
    20 
    21 
    22 str.splitlines([keepends])   #把str按照行分割符分为一个list,keepends是一个bool值,如果为真每行后而会保留行分割符。
    23 str.maketrans(from, to)    #返回一个256个字符组成的翻译表,其中from中的字符被一一对应地转换成to,所以from和to必须是等长的。 
    24 
    25 str.translate(table[,deletechars])   # 使用上面的函数产后的翻译表,把S进行翻译,并把deletechars中有的字符删掉。需要注意的是,如果str为unicode字符串,那么就不支持 deletechars参数,可以使用把某个字符翻译为None的方式实现相同的功能。此外还可以使用codecs模块的功能来创建更加功能强大的翻译表。

      更多方法可以通过help(str)来了解哟,或者直接看官方文档。

      字符串的操作基本呢就以上这些了,但是记不记得我上面说的一句话,字符串是不可变的,那么上面的一堆操作字符串都变成什么样了?那你说字符串不可变不是在瞎扯淡么?那么好重点来了,以上的这些操作,也就是用str中的方法来改变这些字符串的样子,其实是生成了一个新的字符串,而那个旧的呢,依然在内存中。

      字符串中的 encode() decode(),即编码的转换问题,对于新手绝对是一个难点,所以我准备单独写一篇关于字符编码的博客。并且主要是在python2.7中的坑比较多,在python3中则基本不会有什么问题。所以捏这里就不多讲,在上面的操作中我也没有说哦。

      -->>字符编码篇直通车(当然现在还没有完成,遇到了点小小的问题,我的2.7可能装的是个假的。)

     

    二、元组

       上面讲str的时候呢,我是在shell下进行的,现在开始我就要用pycharm,强烈建议新手用这个,Python IDE有很多,pycharm打开速度是慢了点,不过它的功能是毋庸置疑的哦。而且现在很多公司做项目也是用的pycharm。当然了,你也可以用你自己喜欢的。下面开始笔记啦。

      元组和字符串一样,元组也是不可修改的。元组使用小括号,元组的创建很简单,只需要在括号中添加元素,并使用逗号隔开即可(在str中并没有怎么说明字符串的创建,因为啊,引号一加,谁还不是字符串呢!)。元组需要掌握的分别有创建、访问、修改、删除、切片、检测等

      1.创建

    1 #创建一个带有元素的元组
    2 tuple_name = ("Lyon","Alex","Leon",1,2,3)
    3 #这样也可以
    4 tuple_names = "Lyon","Alex","Leon",1,2,3
    5 #创建一个空元组
    6 tuple_empty = ()
    7 #当元组中只有一个元素,加逗号来消除歧义哟,这是一个好习惯,因为()既可以表示tuple又可以表示数学公式中的小括号
    8 tuple_one = ("Lyon",)

      2.访问

    1 #创建一个元组
    2 tuple_name = ("Lyon","Alex","Leon",1,2,3)
    3 #访问元组中的第一个元素并打印结果,下标索也是从0开始
    4 print(tuple_name[0])    #打印:Lyon
    5 #访问元组中第一和第二个元素并打印结果
    6 print(tuple_name[0:2])  #打印:('Lyon', 'Alex')

      注:结果发现访问单个元素结果是字符串类型哟,而多个则是元组类型。字符串中每个字符就是一个元素,而元组中则是一个数字或者一个字符串就是一个元素。

      3.修改

    #创建一个元组
    tuple_name = ("Lyon","Alex","Leon",1,2,3)
    #创建另一个元组
    tuple_num = (1,2,3,4,5)
    #生成一个新的元组
    tuple_total = tuple_name + tuple_num
    #打印tuple_total
    print(tuple_total)  #打印:('Lyon', 'Alex', 'Leon', 1, 2, 3, 1, 2, 3, 4, 5)
    #复制元组内元素一次
    tuple_total = tuple_name * 2
    #打印tuple_total看结果
    print(tuple_total)      #打印:('Lyon', 'Alex', 'Leon', 1, 2, 3, 'Lyon', 'Alex', 'Leon', 1, 2, 3)
    #在列表中可以通过索引取值后进行修改,但是元组里面是非法的哦
    tuple_name[0] = "lyon"      #这里直接就报错

      注:上面就说了的,元组也是不可变的,这里的操作都是生成了一个新的元组。

      4.删除

    1 #创建一个元组
    2 tuple_name = ("Lyon","Alex","Leon",1,2,3)
    3 # 删除元组tuple_name
    4 del tuple_name
    5 #打元组tuple_name
    6 print(tuple_name)   #这里直接报错:name 'tuple_name' is not defined ,因为已经删除了
    7 #下面这种方式也是不行的
    8 del tuple_name[0]     #这里报错: 'tuple' object doesn't support item deletion

      5.切片

      如2小点访问中的索引一样,就是利用index(下标)来进行操作。这个呢,还是放到列表中来写。

      6.检测

    1 #创建一个元组
    2 tuple_name = ("Lyon","Alex","Leon",1,2,3)
    3 #"Lyon"是否在tuple_name中,打印结果
    4 print("Lyon" in tuple_name)     #打印 True

      7.更多

     1 #创建一个元组
     2 tuple_name = ("Lyon","Alex","Leon",1,2,3)
     3 #计算元组元素个数
     4 tuple_len = len(tuple_name)     
     5 #打印结果
     6 print(tuple_len)        #打印:6
     7 #创建一个元素全为数字的元组
     8 tuple_num = (1,2,3,4,5)
     9 #返回元组中的最大值
    10 print(max(tuple_num))       #打印:5
    11 #返回元组中的最小值
    12 print(min(tuple_num))       #打印:1
    13 #创建一个列表
    14 list_name = ["Lyon","Alex","Leon"]
    15 #将列表转换为元组
    16 tuple_names = tuple(list_name)
    17 #打印tuple_names
    18 print(tuple_names)      #打印:('Lyon', 'Alex', 'Leon')

      更多详细资料可以通过help(tuple)来查找哟,或者直接看官方文档。

    三、列表

       列表是我们以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作。接下来就要开始详细说说列表中的基本操作了。列表是可变的,所以操作也会有点多。基本操作有:创建、访问、切片、追加、插入、修改、删除、扩展、拷贝(copy)、统计、排序&翻转、获取下标等

      1.创建

    1 #创建一个列表
    2 names = ["Alex","Lyon","Leon"]
    3 #创建一个空列表
    4 names = []

      2.访问

     1 #创建一个列表
     2 names = ["Alex","Lyon","Leon"]
     3 #与字符串的索引一样,列表索引从0开始
     4 #访问列表中的第一个元素
     5 fristname = names[0]
     6 #访问列表中第三个元素
     7 threename = names[2]
     8 #访问列表中最后一个元素
     9 endname = names[-1]
    10 #访问倒数第二个元素
    11 secondlastname = names[-2]
    12 
    13 #注:以上运行时并不会有结果,获取结果应该利用print方法来进行

      3.切片

     1 #创建一个列表
     2 names = ["Alex","Lyon","Leon","CTO","WuHan"]
     3 #取下标为1至下标3之间的值,包括1,不包括4
     4 cutnames1 = names[1:3]
     5 #打印cutnames1
     6 print(cutnames1)    #打印:['Lyon', 'Leon']
     7 #取下标为1至-1的值,不包括-1(-1就是最后一个)
     8 cutnames2 = names[1:-1]
     9 #打印cutnames2
    10 print(cutnames2)    #打印:['Lyon', 'Leon', 'CTO']
    11 #从第一个到第三个
    12 cutnames3 = names[0:3]
    13 #从头开始取,0可以省略,跟上面的效果一样
    14 cutnames4 = names[:3]
    15 #打印cutnames3,cutnames4
    16 print(cutnames3,cutnames4)  #打印:['Alex', 'Lyon', 'Leon'] ['Alex', 'Lyon', 'Leon']
    17 #想取最后一个,只能这样写,切片是不包含后一个参数的
    18 cutnames5 = names[3:]
    19 #后面的2是代表,每隔一个元素,就取一个
    20 cutnames6 = names[0::2]
    21 #或者这样
    22 cutnames7 = names[::2]
    23 #打印cutnames6,cutnames7
    24 print(cutnames6,cutnames7)  #打印:['Alex', 'Leon', 'WuHan'] ['Alex', 'Leon', 'WuHan']

       4.追加

    1 #创建一个列表
    2 names = ["Alex","Lyon","Leon","CTO","WuHan"]
    3 #追加一个元素
    4 names.append("New")
    5 #打印names
    6 print(names)    #['Alex', 'Lyon', 'Leon', 'CTO', 'WuHan', 'New']
    7 
    8 #注:append 方法只能追加到列表的最后一位

      5.插入

     1 #创建一个列表
     2 names = ["Alex","Lyon","Leon","CTO","WuHan","New"]
     3 #插入到下标1前面
     4 names.insert(1,"Insert")
     5 #打印names
     6 print(names)    #['Alex', 'Insert', 'Lyon', 'Leon', 'CTO', 'WuHan', 'New']
     7 #如果下标不存在就会插入到最后一个
     8 names.insert(7,"NoIndex")
     9 #打印names
    10 print(names)    #['Alex', 'Insert', 'Lyon', 'Leon', 'CTO', 'WuHan', 'New', 'NoIndex']

      6.修改

    1 #创建一个列表
    2 names = ['Alex', 'Insert', 'Lyon', 'Leon', 'CTO', 'WuHan', 'New', 'NoIndex']
    3 #把 'WuHan' 改成 'BeiJing'
    4 names[5] = 'BeiJing'
    5 #打印names
    6 print(names)
    7 #注:就是通过下标直接改变list本身哟

      7.删除

     1 #创建一个列表
     2 names = ['Alex', 'Insert', 'Lyon', 'Leon', 'CTO', 'BeiJing', 'New', 'NoIndex']
     3 #删除下标为7的元素
     4 del names[7]        #以下标取值删除
     5 #打印names
     6 print(names)    #打印:['Alex', 'Insert', 'Lyon', 'Leon', 'CTO', 'BeiJing', 'New']
     7 #删除 'Insert'
     8 names.remove("Insert")      #remove删除指定元素
     9 #打印names
    10 print(names)    #打印:['Alex', 'Lyon', 'Leon', 'CTO', 'BeiJing', 'New']
    11 names.pop()     #删除列表的最后一个值
    12 #打印names
    13 print(names)    #打印:['Alex', 'Lyon', 'Leon', 'CTO', 'BeiJing']

      8.扩展

     1 #创建一个列表
     2 names = ['Alex', 'Lyon', 'Leon', 'CTO', 'BeiJing']
     3 #创建另一个列表
     4 name = ["IT",21,"man"]
     5 #将name扩展到names
     6 names.extend(name)
     7 #打印names
     8 print(names)    #打印:['Alex', 'Lyon', 'Leon', 'CTO', 'BeiJing', 'IT', 21, 'man']
     9 
    10 #这里还有一个"万恶的'+' "也是可以的
    11 print(names + name)   #结果是一样的哦

      9.拷贝

    1 #创建一个列表
    2 names = ['Alex', 'Lyon', 'Leon', 'CTO', 'BeiJing',"IT",21,"man"]
    3 #拷贝names
    4 names_copy = names.copy()    # 浅copy
    5 #打印names_copy
    6 print(names_copy)   #打印:['Alex', 'Lyon', 'Leon', 'CTO', 'BeiJing', 'IT', 21, 'man']

      注:在python2.7中列表的内置函数是没有copy这个方法的,这是在python3后加的,并且python3也只有有copy(浅copy)这一个方法,用深copy需要我们导入copy模块喲,即 import copy 。

      深、浅copy:对于简单的object,shallow copy 和deep copy 是没有区别的。但是对于复杂的object,shallow copy 和deep copy 就会有不一样的结果,这跟python的变量储存方式是脱不开关系的。这么来讲,在python中创建一个变量即为该变量打上一个以该变量名命名的标签,而当我重新赋值时,就会把之前的标签拿下来,打到新的变量上,例如:

     1 #为 "Lyon" 打上一个 "a标签"
     2 a = "Lyon"
     3 #b = a 即给"Lyon"再打上一个  "b标签"
     4 b = a
     5 #给a重新赋值,那么"Lyon"上的 "a标签" 就会被拿掉
     6 a = "New"
     7 #打印a
     8 print(a)        #打印:New
     9 #打印b
    10 print(b)        #打印:Lyon

      读取变量其实就相当于到贴有"a、b标签"的 "房子" 里面去拿东西,ab就是这个房子的门牌号啦。a的门牌号发生了改变,你知道变量名是唯一的,也就是说门牌号是唯一的,所以你只看得到最后一次修改的门牌号,以上有两个房子,便于理解我首先定义为房子1和房子2,首先给房子1贴了个门牌号 " a " ,然后又给房子1贴了个门牌号 " b " ,而后我又把房子1的门牌号" a "撕了下来贴到了房子2,所以a的值发生了改变,而b的值是没有变的。

      有了上面的列子就好说了,其实shallow copy(浅copy)就是贴 "门牌号"(打标签) 的故事;而deep copy(深copy) 则是符合我们心中的拷贝,就是把原来的东西拷贝一份,于是就有了独立的两份,所以你对其中一份作出改变,另一份并不会发生变化哟。

      注:上述中讲的复杂的object。上述说到对于简单的object两者并没有区别,这里我推测:因为就算是 浅copy 也能把简单的object拷贝并独立出来,也就是说他能做一层工作并且也只能做这一层工作,而对于复杂的object,比如list嵌套的object,浅copy只能把第一层的list copy过来,而再下一层就不行啦。还是给个例子吧:

     1 #导入copy模块
     2 import copy
     3 #创建一个嵌套的list
     4 object = ["num","1",["Lyon",21]]
     5 #进行浅copy
     6 cop1 = copy.copy(object)
     7 #进行深copy
     8 cop2 = copy.deepcopy(object)
     9 #改变object里面嵌套的list中的元素
    10 object[2][1] = 18
    11 #顺便改变第一层list的元素看看
    12 object[1] = 2
    13 #打印cop1
    14 print(cop1)     #打印:['num', '1', ['Lyon', 18]]
    15 #打印cop2
    16 print(cop2)     #打印:['num', '1', ['Lyon', 21]]
    17 #我们可以看到第一层并没有改变,但是第二层变了哟

      到这里相信对于深浅copy你已经懂了吧,如果还不够透彻你可以看看这个  超链接  ,我也参考了一点哟。注意哦,深浅copy不仅仅list有,dict,set这些数据类型都是一样的。     

       10.统计

    1 #创建一个列表
    2 names = ['Alex', 'Lyon', 'Leon', 'CTO', 'BeiJing',"IT",21,"man"]
    3 #统计 "Lyon" 的个数,并打印
    4 print(names.count("Lyon"))      #打印:1

      11,排序&翻转

     1 #创建一个列表
     2 names = ['Alex', 'Lyon', 'Leon', 'CTO', 'BeiJing',"IT",21,"man"]
     3 #在python3中不同的数据类型不能一起排序哟,换成str
     4 names[-2] = "21"
     5 #排序,顺序为数字>大写>小写
     6 names.sort()
     7 #打印names
     8 print(names)        #打印:['21', 'Alex', 'BeiJing', 'CTO', 'IT', 'Leon', 'Lyon', 'man']
     9 #翻转
    10 names.reverse()
    11 #打印names
    12 print(names)        #打印:['man', 'Lyon', 'Leon', 'IT', 'CTO', 'BeiJing', 'Alex', '21']

      12.获取下标

    1 #创建一个列表
    2 names = ['Alex', 'Lyon', 'Leon', 'CTO','Lyon']
    3 #获取下标并打印
    4 print(names.index('Lyon'))      #打印:1  
    5 #注:只返回找到的第一个下标

      更多详细资料可以通过help(list)来查找哟,或者直接看官方文档。

    四、字典

       字典是一种key - value 的数据类型,用 冒号(" : ") 来分割,每个对象之间用逗号(" , ")分割。整个字典包括在花括号({ })中。

      字典中的键(key)是唯一的,但值(value)则不必。字典是可变的数据类型,并且是无序的。基本操作:创建、增加、修改、删除、查找、遍历、多级嵌套等。在开始操作之前要注意字典键的特性:

    1)key是唯一的,如果出现多个相同的key被赋值,那么值为最后一个赋的值

    2)key是不可变的,所以可变的数据类型是不能用的,如:list。对于不可变的数据类型则可以,如:str、int、tuple

      1.创建

    1 #创建一个空字典
    2 empty_info = {}
    3 #创建一个字典
    4 info = {"name":"Lyon","age":21}

      2.增加

    1 #创建一个字典
    2 info = {"name":"Lyon","age":21}
    3 #增加新的键/值对
    4 info["school"] = "university"
    5 #打印info
    6 print(info)     #打印:{'school': 'university', 'age': 21, 'name': 'Lyon'}
    7 
    8 #注:字典是无序的,所以打印结果也是随机打印

      3.修改

    1 #创建一个字典
    2 info = {"name":"Lyon","age":21,"school":"university"}
    3 #修改age
    4 info["age"] = 18
    5 #打印info
    6 print(info)     #打印:{'age': 18, 'school': 'university', 'name': 'Lyon'}

      4.删除

     1 #创建一个字典
     2 info = {"name":"Lyon","age":21,"school":"university"}
     3 #标准删除姿势
     4 info.pop("school")
     5 #打印info
     6 print(info)     #打印:{'name': 'Lyon', 'age': 21}
     7 #换个姿势
     8 del info["age"]
     9 #打印info
    10 print(info)     #打印:{'name': 'Lyon'}
    11 #还有个随机删除,哈哈,因为只有一个键值对了,所以你懂的
    12 info.popitem()
    13 #打印info
    14 print(info)     #打印:{}  空啦

      5.查找

     1 #创建一个字典
     2 info = {"name":"Lyon","age":21,"school":"university"}
     3 #标准查找,我就直接打印了,在返回True,否则False
     4 print("name" in info)       #打印:True
     5 #获取值,继续直接打印
     6 print(info.get("name"))     #打印:Lyon
     7 #换换姿势,跟上面一样
     8 print(info["name"])         #打印:Lyon
     9 #区别来了,如果一个key不存在,就会报错,但是get方法,不存在值返回None
    10 print(info["home"])
    11 #报错:KeyError: 'home'

      6.遍历(循环)

     1 #创建一个字典
     2 info = {"name":"Lyon","age":21,"school":"university"}
     3 #方法1
     4 for key in info:
     5     print(key,info[key])
     6 #方法2
     7 for k,v in info.items():
     8     print(k,v)
     9 '''
    10 结果:
    11 school university
    12 name Lyon
    13 age 21
    14 school university
    15 name Lyon
    16 age 21
    17 '''

      7.多级嵌套

     1 #创建一个多级嵌套字典
     2 datas ={
     3     '湖北省':{
     4         "武汉市":{
     5                "武昌区":["Hello"],
     6                "洪山区":["Sorry"],
     7                "江夏区":["Welcome"],
     8          },
     9     },
    10     '湖南省':{
    11         "长沙市":{
    12             "岳麓区":{},
    13             "天心区":{},
    14             "芙蓉区":{},
    15         },
    16     },
    17     '广东省':{
    18         "佛山市":{
    19             "三水区":{},
    20             "顺德区":{},
    21             "男海区":{},
    22         },
    23     },
    24 }
    25 #修改最里层的value
    26 datas["湖北省"]["武汉市"]["武昌区"].append("Lyon")
    27 #打印结果
    28 print(datas["湖北省"]["武汉市"])      #打印:{'洪山区': ['Sorry'], '武昌区': ['Hello', 'Lyon'], '江夏区': ['Welcome']}

      8.更多

     1 len(dict)        #计算字典元素个数
     2 str(dict)        #输出字典可打印的字符串表示,数据类型会发生改变
     3 dict.clear()     # 清空词典所有条目
     4 dict.fromkeys(seq, val))      #创建一个新字典,以列表 seq 中元素做字典的键,val 为字典所有键对应的初始值
     5 dict.has_key(key)       #如果键在字典dict里返回true,否则返回false
     6 dict.items()        #以列表返回可遍历的(键, 值) 元组数组
     7 dict.keys()     #以列表返回一个字典所有的键
     8 dict.values()       #以列表返回字典中的所有值
     9 dict.setdefault(key, default=None)      #和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
    10 dict.update(dict2)      #把字典dict2的键/值对更新到dict里

      更多详细资料可以通过help(dict)来查找哟,或者直接看官方文档。

    五、集合

       集合是一个无序的,不重复的数据组合,它的主要作用如下:

      • 去重,把一个列表变成集合,就自动去重了
      • 关系测试,测试两组数据之前的交集、差集、并集等关系

      python2.7中我们看到的集合都是set([1,2,3 ])这样的,而在python3中则是{1,2,3}这样的。我用的就是3,所以看到这个东西别以为它是一个错误的字典,它其实是是一个集合(set)!集合的应用还是很多的,所以不要轻视这个东西哟。

      集合中的操作也跟以上的数据类型有一些差异,集合支持一系列标准操作,包括并集、交集、差集和对称差集,如下:

    1 a = t | s         # t 和 s的并集
    2 b = t & s         # t 和 s的交集
    3 c = t – s         # 求差集(项在t中,但不在s中)
    4 d = t ^ s         # 对称差集(项在t或s中,但不会同时出现在二者中)

      集合的增删改查跟上述数据类型也是大同小异,所以直接给说明就不举例子了。

      基本操作:

     1 创建方式:
     2 #2和3都行
     3 #方式一:
     4 s = set([1,2,3])
     5 #方式二:
     6 s = {1,2,3}
     7 
     8 基本操作:
     9 s.add('x')            # 添加一项  
    10 s.update([10,37,42])  # 在s中添加多项   
    11 s.remove(1)      #删除一项
    12 len(s)      #set 的长度   
    13 x in s    #测试 x 是否是 s 的成员  
    14 x not in s    #测试 x 是否不是 s 的成员    
    15 s.issubset(t)   #s <= t  测试是否 s 中的每一个元素都在 t 中,s>t返回False  
    16 s.issuperset(t)   #s >= t  测试是否 t 中的每一个元素都在 s 中,同上  
    17 s.union(t)    #s | t  返回一个新的 set 包含 s 和 t 中的每一个元素  
    18 s.intersection(t)   #s & t  返回一个新的 set 包含 s 和 t 中的公共元素  
    19 s.difference(t)   #s - t  返回一个新的 set 包含 s 中有但是 t 中没有的元素  
    20 s.symmetric_difference(t)    #s ^ t  返回一个新的 set 包含 s 和 t 中不重复的元素  
    21  

      更多详细资料可以通过help(set)来查找,或者直接看官方文档,或者百度吧。

    获奖感言:

      写博客,一、是为了分享自己的心得;二、是希望看到的大佬们可以帮忙矫正错误的地方;三、希望有人一起探讨。

      在这里对Alex老师说声对不起,因为啊哈哈,我举的例子好像都有他。

      告诉你们:长相分两种,一种是好看的,一种是难看的,你是属于中间的,好难看的。

      注:该获奖感言以正能量为主,以逗为辅。

  • 相关阅读:
    (Delphi) Using the Disk Cache 使用磁盘缓存
    当电视沦为“情怀”,5G能不能拯救它?(zz)
    何为优秀的机器学习特征 zz
    BP神经网络算法推导及代码实现笔记zz
    偏差(Bias)和方差(Variance)——机器学习中的模型选择zz
    关于管理,你可能一直有 3 个误解zz
    读《赋能》有感zz
    Concept Drift(概念漂移)
    第四范式涂威威:AutoML技术现状与未来展望
    韩家炜在数据挖掘上开辟的「小路」是什么
  • 原文地址:https://www.cnblogs.com/lyonyang/p/7040731.html
Copyright © 2020-2023  润新知