入门第七课 Python的列表和字典详解

一、列表

1.1 从列表中取值

a=[1,2,3,4,5]

分析:a是一个变量,它的值是[1,2,3,4,5]

如果我们想提取第3个数,并把这个数赋值给b,要怎么写呢?

首先说明一个语法,a[0]代表a中第一个数,也就是1;之后a[1]代表a中第2个数,也就是2,以此类推。

那么上面的题目就有了答案:a中第三个数是a[2],赋值给b,就可以写成b=a[2]

(大家别问why,因为Python就是这样设计的,真的想问,请发邮件给Python的创始人。。。)

2、创建列表

上面a的值,是[1,2,3,4,5]。列表中可以有1个值,可以有100个值,也可以没有值,也就是空的列表:[]。空列表同样可以赋值给变量:

>>> c=[]

这样c就是一个空列表,还可以这样写:

>>> c=list()

同样是创建了一个变量c,并赋值为一个空列表。

3、对于列表,可以做很多的操作和处理。

我们讲到字符串的时候,说字符串可以提取按要求提取一部分,列表也可以。格式是list[start:end:step],start是开始位置,end是结束位置,step是步进数。

举个栗子-_-!!

>>> a=["Apple","Facebook","Oracle","Amazon","Microsoft","Baidu","Alibaba"]
>>> a[0]
'Apple'
>>> a[-1]
'Alibaba'
>>> a[0:1]
['Apple']
>>> a[0:2]
['Apple', 'Facebook']
>>> a[1:]
['Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba']
>>> a[1::2]
['Facebook', 'Amazon', 'Baidu']

变量a是一个列表,列表中包含了7个值,对应的索引(也就是值在列表中的位置)分别是0、1、2、3、4、5和6,也可以是-7、-6、-5、-4、-3、-2和-1。所以:

a[0]的返回值是‘Apple’

a[-1]的返回值是‘Alibaba’

a[0:1],这个和字符串的截取逻辑一致,即截取列表的一段。在这一段中,包含a[0],但不包含a[1]。

a[0:2],返回值是a[0]和a[1],这里没有步进数,默认值为1。

a[1:],对于索引范围带有冒号的,如果只有前面的start,后面没有end的,等同于从a[1]开始直至最后且步进数为1。大家试试看a[:-2],看看结果是多少?

a[1::2],意思是从a[1]开始取值直至列表的最后一个值,步进数是2,也就是每次跨过一个值取下一个。

4、列表可迭代的,不用纠结“什么是可迭代的?”,来,一起看示例:

>>> a
['Apple', 'Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba']
>>> for i in a:
        print(i)

    
Apple
Facebook
Oracle
Amazon
Microsoft
Baidu
Alibaba

只要是可迭代的,就能使用for循环来逐个读取并打印可迭代对象中的每一个值。

6、其他

6.1 列表和字符串,都可以使用*来倍增。

>>> b=a*3
>>> b
['Apple', 'Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba', 'Apple', 'Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba', 'Apple', 'Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba']

6.2 列表和字符串一样,可以用+相连,组成新的列表。

>>> a
['Apple', 'Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba']
>>> b=['Tencent','JD']
>>> c=a+b
>>> c
['Apple', 'Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba', 'Tencent', 'JD']

6.3 可以使用len()函数,来计算列表中有多少项。

>>> a
['Apple', 'Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba']
>>> len(a)
7

max(),返回列表中的最大值;

min(),返回列表中的最小值。

>>> a=[1,2,3,4,5,6,7,8,9]
>>> max(a)
9
>>> min(a)
1

6.4 字符串中使用的in和not in,在列表中同样适用。

>>> a
['Apple', 'Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba']
>>> d='Amazon'
>>> if d in a:
        print("a中包含d")

    
a中包含d
>>> e='IBM'
>>> if e not in a:
        print("a中没有e")

    
a中没有e

6.5 列表表达式

>>> a=[x+100 for x in range(10)]
>>> a
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109]

分析一下:

1)for x in range(10),返回的是一个列表,从0到9。

2)a的格式是[.......],那么a也是一个列表,不过a的值是在上面这个列表值基础上加上了100。

6.6 列表的方法

所谓方法,就是列表改变自身的用法。

1)a.append(b),a是列表,b是新的值。执行后,会把b加到a的最后一项。

>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a.append(10)
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

2)a.count(b),a是列表,b是1个值。执行后,返回b在a中出现的次数。

>>> f=[1,2,3,4,5,6,7,8,1,2,1,9]
>>> f.count(1)
3

3)a.count(b),a是列表,b也是列表。执行后,把b接在a的后面。

>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> f
[1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 1, 9]
>>> a.extend(f)
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 1, 9]

4)a.index(b),a是列表,b是一个值。执行后,返回b在a中第一次出现时的索引值。

>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 1, 9]
>>> a.index(8)
7

这里再次强调索引值,从0开始!!!

5)a.insert(b,c),a是列表,b是索引值,c是一个值。执行后,把c按照索引值b插入a。

>>> a.insert(3,"JD")
>>> a
[1, 2, 3, 'JD', 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 1, 9]

6)a.remove(b),a是列表,b是一个值。执行后,删除第一个匹配值。

>>> c
['Apple', 'Facebook', 'Oracle', 'JD', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba', 'Tencent', 'JD']
>>> c.remove("JD")
>>> c
['Apple', 'Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba', 'Tencent', 'JD']

7)a.reverse(),a是列表。执行后,列表a反转。

>>> c
['Apple', 'Facebook', 'Oracle', 'Amazon', 'Microsoft', 'Baidu', 'Alibaba', 'Tencent', 'JD']
>>> c.reverse()
>>> c
['JD', 'Tencent', 'Alibaba', 'Baidu', 'Microsoft', 'Amazon', 'Oracle', 'Facebook', 'Apple']

8)a.pop(b),a是列表,b是索引(默认值是-1)。执行后把a中指定的索引值删除,并返回删除的值。

>>> c
['JD', 'Tencent', 'Alibaba', 'Baidu', 'Microsoft', 'Amazon', 'Oracle', 'Facebook', 'Apple']
>>> c.pop()
'Apple'
>>> c
['JD', 'Tencent', 'Alibaba', 'Baidu', 'Microsoft', 'Amazon', 'Oracle', 'Facebook']
>>> c.pop(1)
'Tencent'
>>> c
['JD', 'Alibaba', 'Baidu', 'Microsoft', 'Amazon', 'Oracle', 'Facebook']

9)a.sort(),a是列表。执行后,a中的值按需排列。

>>> h=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 1, 9]
>>> h.sort()
>>> h
[1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]

再看这个例子:

>>> a=[9,6,2,5,1,7]
           
>>> a
           
[9, 6, 2, 5, 1, 7]
>>> b=a.sort()
           
>>> b
           
>>> a
           
[1, 2, 5, 6, 7, 9]

我们看到a.sort改变了a中元素的排列顺序。但是并未向b赋值!!!

另外,list.sort()这个函数可以有2个参数,即:list.sort(key,reverse)。其中key是一个函数,这个函数会在列表中每一个元素被调用时执行一次;reverse默认为False,即升序排列,如果写成reverse=True就会变成降序排列。

例如:

list_001=['apple','facebook','whatsapp','baidu','tencent']

list_001.sort(key=hanshu_001,reverse=True)

结果是什么呢?

a) 首先,list_001本身被修改、被排序、排倒序。

b) list_001中的元素在排序时:调用第一个元素‘apple’时,会执行hanshu_001(apple),之后调用第二个元素‘facebook’,也会执行hanshu_001(facebook)......说白了就是排序并未按照list_00中的元素排序,而是按照hanshu_001把每个元素做了处理,然后再排序。

 看示例:

>>> student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10),
]
           
>>> student_tuples.sort(key=lambda student: student[2])
           
>>> student_tuples
           
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

如果key函数指定的值相同,则顺序不变。

另外,key函数不仅可以访问需要排序元素的内部数据,还可以访问外部的资源,例如,如果学生的成绩是存储在dictionary中的,则可以使用此dictionary来对学生名字的list排序,看示例:

>>> students = ['dave', 'john', 'jane']
           
>>> newgrades = {'john': 'F', 'jane':'A', 'dave': 'C'}
           
>>> students.sort(key=newgrades.__getitem__)
           
>>> students
           
['jane', 'dave', 'john']

分析一下:key函数指定字典newgrades中值为排序参照,然后对students中的元素做排序,排升序。

10)a.clear(),a是列表。执行后,清空a中的值,使a称为一个空列表。

>>> h
[1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]
>>> h.clear()
>>> h
[]

11)a.copy(),a是列表。

>>> j=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 1, 9]
>>> k=j.copy()
>>> k
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 1, 9]

7、列表解析

什么是列表解析?

简单来说,列表解析(list comprehension)提供了一种优雅的生成列表的方法,能用一行代码代替十几行代码,而且不损失任何可读性。而且,性能还快很多很多。

简单给个例子,如果我们需要0~100所有偶数组成的列表,正常的代码应该是这样的:

>>> a=[]
>>> for i in range(101):
        if i%2==0:
          a.append(i)

        
>>> a
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]

用列表解析来做就是这样的:

>>> a=[x for x in range(101) if x%2==0]
>>> a
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]

简单的一行代码代替了4行代码

从上面的例子来看列表解析的语法其实不难,可以把[ ]中的代码分成三个部分来看

1)x:我们需要的列表里面的结果(第一部分)

2)for x in range(101):x来源——0~100的数字(第二部分)

3)if x%2==0:x成立的条件,如果不成立就不放在列表里了(第三部分)

再举个栗子:-_-!!
正常的代码:
>>> text="My house is full of flowers"
>>> first_charts=[]
>>> for word in text.split():
      first_charts.append(word[0])

    
>>> first_charts
['M', 'h', 'i', 'f', 'o', 'f']

对比一下使用列表解析的代码:

>>> text='I wanna learn Python.'
>>> first_charts=[]
>>> for word in text.split():
    first_charts.append(word[0])


>>> first_charts
['I', 'w', 'l', 'P']

可以看出,列表解析的第一部分也可以是任意一个表达式。

示例3:

来个复杂的,a=[6,7,8,9];b=[1,2,3,4],想要得到a,b对应位的乘积:

>>> a=[6,7,8,9]
>>> b=[1,2,3,4]
>>> c=[i*j for i,j in zip(a,b)]
>>> c
[6, 14, 24, 36]

除了列表解析,还需要使用zip函数来帮忙,zip将a,b对应位打包起来,返回[[2,3][3,4][4,5][5,6]]

示例4:

带有if else的列表解析

list_a=['9','2','3','i','7'],现在想将a中所有能转化为数字的字符串转化为数字,不为数字的内容都转换成0,用列表解析可以这样写:

>>> list_a=['9','2','3','i','7']
>>> b=[int(i) if i.isdigit() else 0 for i in list_a]
>>> b
[9, 2, 3, 0, 7]

如果list_a=['7','2','3',8,125,'o','6'],如果不能转换成数字则为None,列表解析可以这样写:

>>> list_a=['7','2','3',8,125,'o','6']
>>> c=[int(i) if str(i).isdigit() else None for i in list_a]
>>> c
[7, 2, 3, 8, 125, None, 6]

可以看到,在第一个部分,可以嵌套若干if else的语句在表达式里面。

 示例5:

有时候我们可能需要获取一个长度指定,全为某个值列表:

>>> a=['Python' for i in range(10)]
>>> a
['Python', 'Python', 'Python', 'Python', 'Python', 'Python', 'Python', 'Python', 'Python', 'Python']

得到一个长度为10的,每个元素都是‘Python’的列表。

示例6:

略复杂的列表解析,获取列表中嵌套列表的元素,生成一个无嵌套的新列表:

这个例子说起来挺拗口,实际上是想从[[1,2],[3,4,5],[6,7],[8]]这种列表中,把嵌套在列表中的元素解出来,得到[1,2,3,4,5,6,7,8],用列表解析可以这样写:

>>> a=[[1,2],[3,4,5],[6,7],[8]]
>>> b=[x  for i in a for x in i]
>>> b
[1, 2, 3, 4, 5, 6, 7, 8]

理解起来略有一点麻烦,for i in a,i为子列表,for x in i,x得到每个子列表中的值。这样的列表解析写法确实很难理解,所以有时候我们不要过分的使用复杂的列表解析。

示例7:

获取笛卡尔积。

假设有三个配置列表:

>>> a=['4k','8k','12k']                                                                                                                          
>>> b=['1','2,','3']                                                                                                                             
>>> c=['libaio','bio','directio']

我们想获取其笛卡尔积,列表解析的写法,得到:

>>> a=['4k','8k','12k']
>>> b=['1','2,','3']
>>> c=['libaio','bio','directio']
>>> d=[{'blocksize':x,'numjobs':y,'ioengine':z} for x in a for y in b for z in c]
>>> d
[{'blocksize': '4k', 'numjobs': '1', 'ioengine': 'libaio'}, {'blocksize': '4k', 'numjobs': '1', 'ioengine': 'bio'}, {'blocksize': '4k', 'numjobs': '1', 'ioengine': 'directio'}, {'blocksize': '4k', 'numjobs': '2,', 'ioengine': 'libaio'}, {'blocksize': '4k', 'numjobs': '2,', 'ioengine': 'bio'}, {'blocksize': '4k', 'numjobs': '2,', 'ioengine': 'directio'}, {'blocksize': '4k', 'numjobs': '3', 'ioengine': 'libaio'}, {'blocksize': '4k', 'numjobs': '3', 'ioengine': 'bio'}, {'blocksize': '4k', 'numjobs': '3', 'ioengine': 'directio'}, {'blocksize': '8k', 'numjobs': '1', 'ioengine': 'libaio'}, {'blocksize': '8k', 'numjobs': '1', 'ioengine': 'bio'}, {'blocksize': '8k', 'numjobs': '1', 'ioengine': 'directio'}, {'blocksize': '8k', 'numjobs': '2,', 'ioengine': 'libaio'}, {'blocksize': '8k', 'numjobs': '2,', 'ioengine': 'bio'}, {'blocksize': '8k', 'numjobs': '2,', 'ioengine': 'directio'}, {'blocksize': '8k', 'numjobs': '3', 'ioengine': 'libaio'}, {'blocksize': '8k', 'numjobs': '3', 'ioengine': 'bio'}, {'blocksize': '8k', 'numjobs': '3', 'ioengine': 'directio'}, {'blocksize': '12k', 'numjobs': '1', 'ioengine': 'libaio'}, {'blocksize': '12k', 'numjobs': '1', 'ioengine': 'bio'}, {'blocksize': '12k', 'numjobs': '1', 'ioengine': 'directio'}, {'blocksize': '12k', 'numjobs': '2,', 'ioengine': 'libaio'}, {'blocksize': '12k', 'numjobs': '2,', 'ioengine': 'bio'}, {'blocksize': '12k', 'numjobs': '2,', 'ioengine': 'directio'}, {'blocksize': '12k', 'numjobs': '3', 'ioengine': 'libaio'}, {'blocksize': '12k', 'numjobs': '3', 'ioengine': 'bio'}, {'blocksize': '12k', 'numjobs': '3', 'ioengine': 'directio'}]
>>>

这样就得到一个包含所有参数项目的字典列表,避免了写若干个for循环

示例8:

获取所有可能的组合。

假设有一个配置列表['a','b','c'],我们想获取所有的由a,b,c组成的字符串(可以重复使用,将顺序也考虑在内),列表解析需要配合itertools中的product函数:

>>> from itertools import product
>>> x=['a','b','c']
>>> results = ["".join(i) for i in product(x, repeat=3)]
>>> results
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']

示例9:

矩阵转置
考虑一个矩阵,matrix=[[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12]],现在要获得他的转置矩阵,用列表解析仍然是一行:

>>> matrix=[[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12]]
>>> a=[list(row) for row in zip(*matrix)]
>>> a
[[1, 2, 3], [2, 4, 6], [3, 6, 9], [4, 8, 12]]

matrix使用zip解开(完成转置),列表解析负责将结果生成原来的列表嵌套列表的模式

这个case也可以不用列表解析:

>>> b=list(map(list, zip(*matrix)))
>>> b
[[1, 2, 3], [2, 4, 6], [3, 6, 9], [4, 8, 12]]

也可以使用map函数来实现

列表解析的运行速度

相比于for循环,列表解析的语法是由底层c语言实现的,它和使用for循环遍历对象相比,性能会有很大的提升。

列表解析的将会大大提高python代码的执行效率,在实际工作中感觉也同样明显,应该尽量多使用列表解析。

 这是另外一篇关于列表解析的博文
https://www.cnblogs.com/liu-shuai/p/6098227.html

这里贴出示例,供大家学习。

要求:列出1~10所有数字的平方
####################################################
1、普通方法:
>>> L = []
>>> for i in range(1,11):
...     L.append(i**2)
... 
>>> print L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
####################################################
2、列表解析
>>>L = [ i**2 for i in range(1,11)]
>>>print L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
要求:列出1~10中大于等于4的数字的平方
####################################################
1、普通方法:
>>> L = []
>>> for i in range(1,11):
...     if i >= 4:
...         L.append(i**2)
... 
>>> print L
[16, 25, 36, 49, 64, 81, 100]
####################################################
2、列表解析
>>>L = [ i**2 for i in range(1,11) if i >= 4 ]
>>>print L
[16, 25, 36, 49, 64, 81, 100]
要求:列出1~10所有数字的平方除以2的值
####################################################
1、普通方法
>>> L = []
>>> for i in range(1,11):
...     L.append(i**2/2)
... 
>>> print L
[0, 2, 4, 8, 12, 18, 24, 32, 40, 50]
####################################################
2、列表解析
>>> L = [i**2/2 for i in range(1,11) ]
>>> print L
[0, 2, 4, 8, 12, 18, 24, 32, 40, 50]
要求:列出"/var/log"中所有已'.log'结尾的文件
##################################################
1、普通方法
>>>import os
>>>file = []
>>> for file in os.listdir('/var/log'):
...     if file.endswith('.log'):
...         file.append(file)
... 
>>> print file
['anaconda.ifcfg.log', 'Xorg.0.log', 'anaconda.storage.log', 'Xorg.9.log', 'yum.log', 'anaconda.log', 'dracut.log', 'pm-powersave.log', 'anaconda.yum.log', 'wpa_supplicant.log', 'boot.log', 'spice-vdagent.log', 'anaconda.program.log']
##################################################
2.列表解析
>>> import os
>>> file = [ file for file in os.listdir('/var/log') if file.endswith('.log') ]
>>> print file
['anaconda.ifcfg.log', 'Xorg.0.log', 'anaconda.storage.log', 'Xorg.9.log', 'yum.log', 'anaconda.log', 'dracut.log', 'pm-powersave.log', 'anaconda.yum.log', 'wpa_supplicant.log', 'boot.log', 'spice-vdagent.log', 'anaconda.program.log']
要求:实现两个列表中的元素逐一配对。
1、普通方法:
>>> L1 = ['x','y','z']
>>> L2 = [1,2,3]      
>>> L3 = []
>>> for a in L1:
...     for b in L2:
...         L3.append((a,b))
... 
>>> print L3
[('x', 1), ('x', 2), ('x', 3), ('y', 1), ('y', 2), ('y', 3), ('z', 1), ('z', 2), ('z', 3)]
####################################################
2、列表解析:
>>> L1 = ['x','y','z']
>>> L2 = [1,2,3]
L3 = [ (a,b) for a in L1 for b in L2 ]
>>> print L3
[('x', 1), ('x', 2), ('x', 3), ('y', 1), ('y', 2), ('y', 3), ('z', 1), ('z', 2), ('z', 3)]
使用列表解析生成 9*9 乘法表
>>> print('\n'.join([''.join(['%s*%s=%-2s '%(y,x,x*y)for y in range(1,x+1)])for x in range(1,10)]))
1*1=1  
1*2=2  2*2=4  
1*3=3  2*3=6  3*3=9  
1*4=4  2*4=8  3*4=12 4*4=16 
1*5=5  2*5=10 3*5=15 4*5=20 5*5=25 
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7=7  2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8=8  2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9=9  2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 

二、字典

1、创建字典

>>> d={"name":"zhaoyun","age":30,"height":190,"weight":80}

创建一个变量d,并赋值一个字典给d。

前面说过“name”、“age”这些是键,“zhaoyun”和30这些是值。

2、创建空字典。

f=dict()

f就是一个变量,它得值是一个空白的字典。

3、从字典中取值。

>>> d
{'name': 'zhaoyun', 'age': 30, 'height': 190, 'weight': 80}
>>> d['name']
'zhaoyun'
>>> d['age']
30

4、修改字典。可以修改既有的值,也可以增加键和值。

>>> d
{'name': 'zhaoyun', 'age': 30, 'height': 190, 'weight': 80}
>>> d['age']=40
>>> d['address']='China'
>>> d
{'name': 'zhaoyun', 'age': 40, 'height': 190, 'weight': 80, 'address': 'China'}

5、删除字典中的项或者删除字典。

>>> d
{'name': 'zhaoyun', 'age': 40, 'height': 190, 'weight': 80, 'address': 'China'}
>>> del d['age']
>>> d
{'name': 'zhaoyun', 'height': 190, 'weight': 80, 'address': 'China'}
>>> d.clear()
>>> d
{}
>>> del d
>>> d
Traceback (most recent call last):
  File "<pyshell#103>", line 1, in <module>
    d
NameError: name 'd' is not defined

del d['age'],删除键‘age’即对应值。

d.clear(),清空字典d,但d扔是一个字典,只不过没有值。

del d,删除d这个字典对象,所以执行后再看d的值,系统报错,因为d已经被删除。

6、字典的键,不能使列表,可以是数字、字符串或元组。

7、创建字典时,字典中的键不能重复,否则取值的时候,只能取最后一个值。

>>> f={'name': 'zhaoyun', 'age': 40, 'height': 190, 'weight': 80, 'address': 'China','height':195,'height':200}
>>> f['height']
200
>>> f
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}

 8、函数

和列表类似,字典也有适用的函数和方法

8.1 len(f),返回字典键的个数。

>>> f
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> len(f)
5

8.2 str(f),输出字典

>>> f
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> str(f)
"{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}"

8.3 type(f)

>>> f
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> type(f)
<class 'dict'>

9、字典适用的方法

**下列中的f都是指一个字典。

9.1 f.clear() 

删除字典内所有元素

>>> f
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> f.clear()
>>> f
{}

9.2 f.copy() 

返回一个字典的浅复制

>>> f={'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> h=f.copy()
>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}

 再执行

>>> g=f
>>> g
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> f['age']=35
>>> f
{'name': 'zhaoyun', 'age': 35, 'height': 200, 'weight': 80, 'address': 'China'}
>>> g
{'name': 'zhaoyun', 'age': 35, 'height': 200, 'weight': 80, 'address': 'China'}
>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}

我们看到,浅复制得到的字典h,并未随着f的修改而改变,g却随着f的修改而变化。

9.3 f.fromkeys([a],b)
创建一个新字典,以序列a中元素做字典的键,b为字典所有键对应的初始值。其中b可以不填写,则生成的字典有键,值都是None。

>>> j
{}
>>> j.fromkeys(['name','age'],"Tom")
{'name': 'Tom', 'age': 'Tom'}

9.4 f.get(key, b)

返回指定键的值,如果值不在字典中返回b

>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> h.get('age')
40
>>> h.get('age',111)
40
>>> h.get('salary',111)
111

 9.5 key in f

如果键在字典dict里返回true,否则返回false。

>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> 'name' in h
True
>>> 'salary' in h
False

9.6 f.items()
以列表返回可遍历的(键, 值) 元组数组。

>>> h.items()
dict_items([('name', 'zhaoyun'), ('age', 40), ('height', 200), ('weight', 80), ('address', 'China')])

9.7 f.keys()
以列表返回一个字典所有的键。
 

>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> h.keys()
dict_keys(['name', 'age', 'height', 'weight', 'address'])

9.8 f.setdefault(key, b)
和get()类似, 但如果键不存在于字典中,将会添加键并将值设为b。

>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> h.setdefault('age',111)
40
>>> h.setdefault('salary',111)
111

9.9 f.update(i)
把字典i的键/值对更新到字典f中。
 

>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> i=h
>>> i['salary']=10000
>>> i
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China', 'salary': 10000}
>>> h.update(i)
>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China', 'salary': 10000}

9.10 f.values()
以列表返回字典中的所有值。
 

>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China', 'salary': 10000}
>>> h.values()
dict_values(['zhaoyun', 40, 200, 80, 'China', 10000])

9.11 f.pop(key,b)
删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回b。

>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China', 'salary': 10000}
>>> h.pop('salary',111)
10000
>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> h.pop('salary',111)
111

9.12 f.popitem()
随机返回并删除字典中的一对键和值(一般删除末尾对)。

>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80, 'address': 'China'}
>>> h.popitem()
('address', 'China')
>>> h
{'name': 'zhaoyun', 'age': 40, 'height': 200, 'weight': 80}

10、上面讲到了列表解析,下面介绍下字典解析。

10.1 交换键和值

>>> a={'name':'zhaoyun','age':23,'height':180}
>>> b={value:key for key,value in a.items()}
>>> b
{'zhaoyun': 'name', 23: 'age', 180: 'height'}

10.2 生成字典时,有个问题,一起来看下

>>> {key:value for key in "ABC" for value in range(1,10)}
{'A': 9, 'B': 9, 'C': 9}
>>> {key:value for key in "ABC" for value in "JKL"}
{'A': 'L', 'B': 'L', 'C': 'L'}

按照此方法生成的字典,所有键对应的值都是相同的。

10.3 字典解析的几种方法

a) 使用for

>>> aList={'a','b','c','d'}  
>>> bList={1,2,3,4}  
>>> aDict={x:y for (x,y) in zip(aList,bList)}  
>>> aDict  
{'a': 1, 'd': 2, 'c': 3, 'b': 4}  

b) 使用dict函数

>>> aList={'a','b','c','d'}  
>>> bList={1,2,3,4}  
>>> aDict=dict(zip(aList,bList))  
>>> aDict  
{'a': 1, 'd': 2, 'c': 3, 'b': 4}  

c) 使用运算结果生成字典

>>> aList={'a','b','c','d'}  
>>> bList={1,2,3,4}  
>>> aDict={x:y**2 for (x,y) in zip(aList,bList)}  
>>> aDict  
{'a': 1, 'd': 4, 'c': 9, 'b': 16}  
>>> aList={x*x for x in range(5) if x%2==0}  
>>> aList  
{0, 16, 4}

11、遍历字典的集中方法

 a)遍历键

>>> a
{'a': '1', 'b': '2', 'c': '3'}
>>> for key in a:
       print(key+':'+a[key])
 
a:1
b:2
c:3
>>> for key in a.keys():
       print(key+':'+a[key])
 
a:1
b:2
c:3

在使用上,for key in a和 for key in a.keys():完全等价。

b)遍历值

>>> for value in a.values():
       print(value)
 
1
2
3

c)遍历字典项

>>> for kv in a.items():
       print(kv)
 
('a', '1')
('b', '2')
('c', '3')

d)遍历键值对儿

>>> for key,value in a.items():
       print(key+':'+value)
 
a:1
b:2
c:3
>>> for (key,value) in a.items():
       print(key+':'+value)
 
a:1
b:2
c:3

在使用上for key,value in a.items()与for (key,value) in a.items()完全等价。

>>> a={'name':'zhaoyun','age':23,'height':200}

>>> for i in a:
	print(i)

#遍历字典对象,返回值是“键”,而不是“值”	
name
age
height

>>> for i in a.values():
	print(i)

#通过.values()可以遍历字典的值	
zhaoyun
23
200

#下列2种方法均可遍历字典

>>> for i in a:
	print(i,':',a[i])

	
name : zhaoyun
age : 23
height : 200

>>> for i,j in a.items():
	print(i,':',j)

	
name : zhaoyun
age : 23
height : 200

  

 

posted @ 2018-03-26 20:49  驼背蜗牛  阅读(564)  评论(0编辑  收藏  举报