第三章 Python 的容器: 列表、元组、字典与集合

时间:2024-01-16 20:31:44

列表是Python的6种内建序列(列表,元组,字符串,Unicode字符串,buffer对象,xrange对象)之一,

列表内的值可以进行更改,操作灵活,在Python脚本中应用非常广泛

列表的语法格式

文本格式:

[ 元素1,‘元素2’,‘元素3’,……,‘元素n’]

如:

['to','be','or','not','to','be']

数字格式:

[数字1,数字2,数字3,数字n]

如:

[1,20,15,]

 

在需要操作一组数值的时候,序列很好用。

可以通过序列表示数据库中一个人的信息——第一个元素是姓名,第二个元素是年龄。

根据上述内容编写一个列表

>>> zhangsan = ['zhangsan',18]

>>> lisi = ['lisi',19]

列表中可以嵌套列表,准确的说,列表中可以包含任意的数据类型(字符串、列表、元组、集合)

>>> database=[zhangsan,lisi]

>>> database

[['zhangsan', 18], ['lisi', 19]]

使用 list()函数也可以创建列表

从元组中创建列表

>>> hero =('Zhongkui','Anqila','Houyi','Xiaoqiao')
>>> list(hero)
['Zhongkui', 'Anqila', 'Houyi', 'Xiaoqiao']

从字符串创建列表
>>> list('cat')
['c', 'a', 't']
>>>

使用以下方法可以创建空列表

>>> empty_list = []
>>> empty_list
[]
>>> another_empty_list = list()
>>> another_empty_list
[]
>>>

列表索引和分片

索引、分片和上一章字符串的索引是一样的,不同之处是字符串的一个索引是当字符,而列表的索引是列表中的一个元素

也就是,列表中一对单引号中的数据

 >>> hero
('Zhongkui', 'Anqila', 'Houyi', 'Xiaoqiao')
>>> hero_list = list(hero)
>>> hero_list
['Zhongkui', 'Anqila', 'Houyi', 'Xiaoqiao']
>>> hero_list[0::2]
['Zhongkui', 'Houyi']
>>>

列表的操作

 

列表的基本操作

元素赋值

>>> x = [1,1,1]

>>> x[1] = 2

>>> x

[1, 2, 1]

 

删除元素

>>> provinces

['HeNan', 'HeBei', 'ShanDong', 'ShanXi', 'HuNan', 'HuBei', 'Jiangxi', 'Afuhan']

>>> del provinces[-1]

>>> provinces

['HeNan', 'HeBei', 'ShanDong', 'ShanXi', 'HuNan', 'HuBei', 'Jiangxi']

 

分片赋值

>>> num = [1,2,3,4,5]

>>> num[3:] = [6,7]

>>> num

[1, 2, 3, 6, 7]

 

插入新元素

>>> num[3:3] = [4,5]

>>> num

[1, 2, 3, 4, 5, 6, 7]

 

分片删除

>>> del num[1:4]

>>> num[1:4] = []

>>> num

[1, 5, 6, 7]

列表的方法

1)追加append

>>> num = [1,2,3]

>>> num.append(4)

>>> num

[1, 2, 3, 4]

 

2)统计次数count

>>> ['to','be','or','not','to','be'].count('to')

2

 

3)在列表末尾一次性追加另一个列表的多个值extend

>>> a = [1,2,3]

>>> b = [4,5,6]

>>> a.extend(b[1:3])

>>> a

[1, 2, 3, 5, 6]

 

4)显示列表中某个值第一个匹配项的索引位置index

>>> aaa = ['Today','is','a','nice','day']

>>> aaa.index('nice')

3

 

5)将对象插入到列表中insert

>>> num = [1,2,3,4,5,6]

>>> num.insert(3,'four')

>>> num

[1, 2, 3, 'four', 4, 5, 6]

 

6)移除列表中的一个元素(默认是最后一个),并且返回该元素的值

>>> x = [1,2,3]

>>> x.pop()

3

 

7)移除列表中某个值的第一个匹配项remove

>>> x =  ['to','be','or','not','to','be']

>>> x.remove('be')

 

8)将列表中的元素反向存放reverse

>>> x

['to', 'or', 'not', 'to', 'be']

>>> x.reverse()

>>> x

['be', 'to', 'not', 'or', 'to']

 

9)排序sort和sorted

>>> x = [3,7,4,64,23,71,2]

>>> x.sort()

>>> x

[2, 3, 4, 7, 23, 64, 71]

 

>>> sorted(x)

[2, 3, 4, 7, 23, 64, 71]

 

两者的区别在于sort不返回生成的列表值,sorted返回列表值

元组

创建元组

元组列表一样,也是一种序列。唯一的不同是元组不能修改。

语法

(元素1,元素2,……,元素n)

 

空元组可以用没有包含内容的两个圆括号来表示

()

如果要创建包括一个值的元组,必须加上逗号

(42,)

 

加上逗号和不加逗号代表的含义完全不同

>>> 3*(42)

126

>>> 3*(42,)

(42, 42, 42)

可以一次性将元组赋值给多个变量

>>> marx_tuple = ('Goucho','Chico','Harpo')
>>> a,b,c = marx_tuple
>>> a
'Goucho'
>>> b
'Chico'
>>> c
'Harpo'
>>>

有时候,这个过程被成为元组解包

tuple() 函数和之前提到的 list() 一样,可把其他类型的数据转换为元组

>>> tuple('cat')
('c', 'a', 't')
>>> tuple(hero_list)
('Zhongkui', 'Anqila', 'Houyi', 'Xiaoqiao')
>>>

字典

在Python中通过字典可以通过查找某个特定的键,从而找到它的值

6.1字典的创建

6.1.1语法格式

{a:123,‘b:234,‘c:345,……}

例:

>>> {'zhongkui':1511,'houyi':1509,'xiguatian':1508}

{'zhongkui': 1511, 'houyi': 1509, 'xiguatian': 1508}

将字典赋值给一个变量可以实现轻松查找

>>> shark = {'zhongkui':1511,'houyi':1509,'xiguatian':1508}

>>> shark['xiguatian']

1508

注:在字典中的键是唯一的,而值并不唯一

 

6.1.2通过dict函数创建字典

>>> Iphone = ('Iphone',5999)

>>> LV = ('LV',999)

>>> item = [Iphone,LV]

>>> d = dict(item)

>>> d

{'LV': 999, 'Iphone': 5999}

 

如果现在商场进了一批红塔山,通过dict可以快速添加字典里

>>> Hongtashan = ('Hongtashan',7)

>>> item

[('Iphone', 5999), ('LV', 199999), ('Hongtashan', 7)]

>>> d = dict(item)

>>> d

{'LV': 199999, 'Iphone': 5999, 'Hongtashan': 7}

 

通过dict方便对字典内容进行更新

 

 

4.2字典的基本操作

字典的基本行为在很多方面与序列类似

假设现在有个字典名为d

len(d)返回字典d中项(键-值对)的数量

d[]返回关联到键上的值

d[a]=b将值b关联到键a上

deld[k]删除键为k的项

k  in  d检查d中是否有含有键为k的项

 

>>> d

{'LV': 999, 'QiaQia': 9, 'Iphone': 5999}

>>> len(d)

3

>>> d['LV']

999

>>> d['LV']=1000

>>> d

{'LV': 1000, 'QiaQia': 9, 'Iphone': 5999}

>>> del d['LV']

>>> d

{'QiaQia': 9, 'Iphone': 5999}

>>> 'QiaQia' in d

True

 

 

字典在脚本中的使用

创建一个小程序,查询公司内部员工的个人信息

[root@shark163 ~]# vim people.py

#!/usr/bin/python

people = {

        'mv':{

                'phone': '2341',

                'addr': 'BeiJing'

        },

        'xiguatian': {

                'phone': '9102',

                'addr': 'HeBei'

        },

        'houyi':{

                'phone': '3158',

                'addr': 'ShanDong'

        },

        'libai':{

                'phone': '4556',

                'addr': 'ShanXi'

        }

}

 

[root@shark163 ~]# vim phone.py

#!/usr/bin/python

#coding=utf-8

import people

people = people.people

#变量名   模块名  模块中定义的字典名

labels = {

        'phone': 'phone number',

        'addr': 'address'

}

 

while True:

        name = raw_input('Name: ')

        while name in people:

                request = raw_input('Phone number (p) or address (a)?')

 

                if request == 'p' : key = 'phone'

                if request == 'a' : key = 'addr'

 

                print "%s's %s is %s." % \

                (name, labels[key], people[name][key])

                break

        else:

                YN = raw_input("The user does not exist,enter username again?(Y/N)")

                if YN == 'N' :

                        print "Program is stopping!!!"

                        break

                if YN == 'Y' : continue

 

执行结果:

[root@localhost ~]# python phone.py

Name: xiguatian

Phone number (p) or address (a)?a

xiguatian's address is HeBei.

Name: rn

The user does not exist,enter username again?(Y/N)N

Program is stopping!!!

 

 

6.3字典的方法

1)清空字典中的所有项clear

>>> example = {'zhongkui':1511,'houyi':1509,'xiguatian':1508,'libai':1506}

>>> example

{'zhongkui': 1511, 'libai': 1506, 'houyi': 1509, 'xiguatian': 1508}

>>> example.clear()

>>> example

{}

>>> example = {}

 

2)创建一个具有相同项的新字典copy

>>> y = example.copy()

>>> y

{'zhongkui': 1511, 'libai': 1506, 'houyi': 1509, 'xiguatian': 1508}

 

3)根据给定的键创建一个空值的字典froxiguatianeys

>>> {}.froxiguatianeys(['mv','yum'])

{'mv': None, 'yum': None}

 

默认的空值为None也可以用以下方法手动指定

>>> {}.froxiguatianeys(['mv','yum'],'(unknown)')

{'mv': '(unknown)', 'yum': '(unknown)'}

 

4)访问空值,不报错,返回None值get

>>> example = {'zhongkui':1511,'houyi':1509,'xiguatian':1508,'libai':1506}

>>> print example.get('mv')

None

 

5)检查字典中是否包含特定键has_key,表达式d.has_key(k)等同于k  in  d

>>> example

{'zhongkui': 1511, 'libai': 1506, 'houyi': 1509, 'xiguatian': 1508}

>>> example.has_key('mv')

False

 

6)以列表的方式返回字典中的所有项items

>>> example.items()

[('zhongkui', 1511), ('libai', 1506), ('houyi', 1509), ('xiguatian', 1508)]

 

与items相似的有iteritems方法,区别在于item返回的是一个列表,iteritems返回一个迭代器,方便对其调用

>>> it = y.iteritems()

>>> list(it)

[('zhongkui', 1509), ('libai', 1506), ('houyi', 1508), ('xiguatian', 1504)]

 

7)将字典中的键以列表方式返回keys,而iterkeys则返回针对键的迭代器

>>> example

{'zhongkui': 1511, 'libai': 1506, 'houyi': 1509, 'xiguatian': 1508}

>>> example.keys()

['zhongkui', 'libai', 'houyi', 'xiguatian']

>>> a = example.keys()

>>> list(a)

['zhongkui', 'libai', 'houyi', 'xiguatian']

 

8)获取给定键的值,并将此项从字典中移除pop

>>> example

{'zhongkui': 1511, 'libai': 1506, 'houyi': 1509, 'xiguatian': 1508}

>>> example.pop('zhongkui')

1511

>>> example

{'libai': 1506, 'houyi': 1509, 'xiguatian': 1508}

 

9)随机移除列表中的项popitem

>>> example.popitem()

('libai', 1506)

 

10)用一个字典更新另一个字典update

>>> example

{'xiguatian': 1508}

>>> shark = {'zhongkui':1511,'houyi':1509,'libai':1506}

>>> example.update(shark)

>>> example

{'zhongkui': 1511, 'libai': 1506, 'houyi': 1509, 'xiguatian': 1508}

 

11)以列表的方式返回字典中的值values,返回值的迭代器itervalues

>>> example.values()

[1511, 1506, 1509, 1508]

 

>>> a =example.itervalues()

>>> list(a)

[1511, 1506, 1509, 1508]