目录
2.1序列概述
序列是一种数据结构,其中的元素带编号(从0开始)。列表,字符串,元组都属于序列,其中列表可变,元组和字符串不可变。
Python支持一种数据结构的基本概念,叫容器。容器基本上就是可包含其他对象的对象,序列和映射(如字典)都是容器。这也就是为什么下面的代码是合理的(而且很方便)。
database = [
['a', '123'],
['b', '456'],
['c', '789']
]#列表里面嵌套列表
2.2通用的列表操作
2.2.1索引
序列中的所有元素都有编号,从0开始。可以使用编号来访问各个元素。特别的,Python可以直接使用负数编号,表示从右往左数
>>> gretting = 'hello'
>>> gretting[0]
'h'
#负数索引
>>> gretting[-1]
'o'
#字符串可以直接使用索引
>>> 'hello'[1]
'e'
代码清单2-1
#将以数指定的年,月,日打印出来
months = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December']
#一个列表,其中包含1-31对应的日期结尾
ending = ['st','nd','rd'] + 17*['th'] + ['st','nd','rd'] + 7*['th'] + ['st']
year = input('Year:')
month = input('Month:')
day = input('Day:')
month_number = int(month)
day_number = int(day)
month_name = months[month_number-1]
ordinal = day + ending[day_number-1]
print(month_name + " " + ordinal + "," + year)
#运行结果举例:
#Year:1974
#Month:8
#Day:16
#August 16th,1974
2.2.2切片
可以使用切片来访问特定范围内的元素。第一个索引是包含的第一个元素编号,第二个索引是切片后余下的第一个元素编号,第三个编号是步长。三个索引都可以(部分或全部)省略,索引之间以冒号分开。三个索引都可以使用负数。
关于前两个索引,可以理解为“含前不含后”,第三个索引为步长,如果指定的步长大于1,将跳过一些元素取值(如步长是2,将隔一个元素取值),当然,步长不能为0。
>>> num = [1,2,3,4,5,6,7,8,9]
>>> num[0:3]
[1, 2, 3]
>>> num[2:]
[3, 4, 5, 6, 7, 8, 9]
>>> num[:5]
[1, 2, 3, 4, 5]
>>> num[-3:-1]
[7, 8]
>>> num[0:5:2]
[1, 3, 5]
代码清单2-2
#从类似于http://www.xxxxxx.com中提取域名
url = input('请输入网址')
print("域名是" + url[11:-4])
#结果举例
#请输入网址http://www.baidu.com
#域名是baidu
2.2.3序列相加
可以使用假发运算符来拼接序列,一般,不能拼接不同类型的序列。
>>> [1,2,3]+[4,3]
[1, 2, 3, 4, 3]
2.2.4乘法
将序列与数x相乘时,将重复这个序列的x次来创建一个新序列。
>>> 'pthon'*4
'pthonpthonpthonpthon'
代码清单2-3
#将输入的句子显示在屏幕中央
sentence = input('输入句子')
screen_width = 80
text_width = len(sentence)
box_width = text_width + 6
left_margin = (screen_width - box_width) // 2
print(left_margin*' ' + '+' + (box_width - 2)*'-' + '+')
print(left_margin*' ' + '| ' + text_width*' ' + ' |')
print(left_margin*' ' + '| ' + sentence + ' |')
print(left_margin*' ' + '| ' + text_width*' ' + ' |')
print(left_margin*' ' + '+' + (box_width - 2)*'-' + '+')
2.2.5成员资格
要检查特定的值是否包含在序列中,可以使用运算符in。返回True/False
>>> permission = 'rw'
>>> 'w' in permission
True
>>> emmmm = '%%% emmmm @@@'
>>> '%%%' in emmmm
True
代码清单2-4
#检车用户名和PIN
database = [
['a', '123'],
['b', '456'],
['c', '789']
]
user_name = input('name:')
pin = input('PIN:')
if [user_name,pin] in database:
print("access granted")
#name:a
#PIN:123
#access granted
内置函数len,min,max,分别返回序列的元素个数,最小值,最大值。
2.3列表:Python的主力
2.3.1函数list
list()可以将任何序列转换成列表
>>> list('hell0')
['h', 'e', 'l', 'l', '0']
2.3.2基本的列表操作
1.修改列表:给元素赋值
2.删除元素
>>> name = ['aa', 'bb', 'cc']
>>> del name[1]#使用del语句删除元素
>>> name
['aa', 'cc']
3.给切片赋值
通过切片赋值,可以将切片替换为与其长度不同的序列,甚至可以插入新元素,或者删除已有元素,也可以指定步长来赋值。
>>> name = ['aa', 'bb', 'cc']
>>> name[1:]=['dd','ee','ff']
>>> name
['aa', 'dd', 'ee', 'ff']
>>> name[2:2]=['gg']
>>> name
['aa', 'dd', 'gg', 'ee', 'ff']
>>> name[2:5:2]=['hh','ii']
>>> name
['aa', 'dd', 'hh', 'ee', 'ii']
2.3.3列表方法
调用形式:object.method(arguments)
1.append
用于将一个对象加到列表末尾(直接修改原列表)
2.clear
就地清空列表的内容
>>> lst = [1,2,3]
>>> lst.append(5)
>>> lst
[1, 2, 3, 5]
>>> lst.clear()
>>> lst
[]
3.copy
复制列表,常规复制只是将另一个名词关联到列表(相当于新建一个指针指向列表),而copy则相当于再建一个相同的列表。
#常规复制,a中的值也会跟着变
>>> a = [1,2,3]
>>> b = a
>>> b[1] = 6
>>> a
[1, 6, 3]
#使用copy
>>> b = a.copy()
>>> b[1] = 9
>>> a
[1, 6, 3]
4.count
计算指定元素出现的次数
5.extend
同时将多个值附加到列表末尾
6.index
在列表中查找指定值第一次出现的索引
7.insert
用于将一个对象插入列表
8.pop
从列表中删除一个元素,默认为最后一个元素,并返回这个元素。
9.remove
删除第一个为指定值的元素
10.reverse
反序排序
11.sort
正序排序(对原有列表直接修改),而函数sorted获取排序后的副本(原来的列表还留着).x=[1,4,2] y=sorted(x)
sort还可以传入两个参数,这里比较复杂,用到再说。
2.4元组:不可修改的列表
元组一般使用圆括号,但也可以直接用逗号隔开。
tuple函数和list很像 ,tuple可将序列转换为元组。
元组可以用于字典的键,有些内置函数返回的也是元组。