列表和元组
2016-01-20
1.1数据结构:数据结构是通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他的数据结构。
1.2python中,最基本的数据结构是序列(sequence)。序列中的每个元素被分配一个序列号——即元素的位置,也称为索引。
通用的序列操作
所有的序列类型都可以进行某些特定的操作。这些操作包含:索引(index)、分片(slicing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员(成员资格)。除此之外,python还有计算序列长度、找出某大元素的内建函数。
索引示例:
__author__ = 'Administrator' # 根据给定年月日以数字形式打印日期 month = [ 'January','February','March','April' ,'May','June','July','August','September' ,'October','November','December' ] # 以1-31的数字作为结尾的列表 endings = ['st','nd','rd']+17*['th']\ +['st','nd','rd']+7*['th']\ +['st'] print(endings) # 输入年月日 year = input('Year: ') month = input('Month(1-12): ') day = input('Day(1-31): ') month_number = int(month) day_number = int(day) # 记得要将年份和天数减1,以获取正确的索引 month_name = month[month_number-1] ordinal = day+endings[day_number-1] # 打印结果 print(month_name+' '+ordinal+','+year)
输出结果如下:
1.3 分片
分片:分片通过冒号隔开的两个索引来实现(分片操作对于提取序列的一部分是很有用的)
代码示例如下:
numbers = [1,2,3,4,5,6,7,8,9,10] numbers[3:6] 输出结果:[4,5,6]
分片步长代码示例如下:
1 #分片,包头不包尾 2 numbers = [1,2,3,4,5,6,7,8,9,10] 3 numbers[0:10:1] 4 >>>[1,2,3,4,5,6,7,8,9,10] 5 numbers[0:10:2] 6 >>>[1,3,5,7,9]
使用分片需注意:
1、开始点的元素(最左边元素)包含在结果之中,而结束点的元素(最右边的元素)则不再分片之内。
2、当使用一个负数作为步长时,必须让开始点(开始索引)大于结束点。
1.4
a)序列相加
注意事项:列表和字符串是无法连接在一起的,只有两种相同类型的序列才能进行连接操作。
b)序列乘法
用数字x乘以一个序列会生成一个新的序列,而在新的序列中,原来的序列将被重复x次。
序列(字符串)乘法示例
1 # 以正确的宽度在剧中的“盒子”内打印一个句子 2 # 注意,整数除法运算符(//)只能用在python 2.2以后的后续版本中,之前用的普通除法(/) 3 4 # 输入要打印的字符串 5 sentence = input("Sentence: ") 6 7 # 设置盒子宽度和高度 8 screen_width = 80 9 text_width = len(sentence) 10 # 取字符串长度为盒子宽度 11 box_width = text_width + 6 12 # 设置左边距 13 left_margin = (screen_width-box_width)//2 14 15 # 打印盒子 16 print("\n") 17 print(' '*left_margin + '+'+'-'*(box_width-2)+'+') 18 print(' '*(left_margin+2) + '|'+' '*(text_width) +'|') 19 print(' '*(left_margin+2) + '|'+ sentence +'|') 20 print(' '*(left_margin+2) + '|'+' '*(text_width) +'|') 21 print(' '*left_margin + '+'+'-'*(box_width-2)+'+')
序列成员资格示例:
1 database = [['jim','1234'],['tom','1234']] 2 3 username = input('User name: ') 4 pin = input('PIN code: ') 5 6 if [username,pin] in database: print 'Access granted'
2 列表:python的苦力
列表与字符串不同的地方在于,列表是可变的——可以改变列表的内容。
2.1 list函数
list函数可以将字符串转换为列表,从而可以对该字符串进行修改。
>>>list('Hello') >>>['H','e','l','l','o']
2.2 基本的列表操作
1.改变列表:元素赋值
使用索引标记来为某个特定的、位置明确的元素赋值,如以下代码:
>>>x = [1,1,1] >>>x[1] = 2 >>>x [1,2,1]
2.删除元素
从列表中删除元素也很容易:使用del语句来实现。如以下代码:
>>>names = ['jim','tom','jack'] >>>del names[1] >>>names ['jim','jack']
3.分片赋值
分片赋值是一个非常强大的特性,分片赋值操作则更显它的强大。示例如下:
#使用分片赋值时,可以使用与原序列不等长的序列将分片替换 >>>name = list('Perl') >>>name[1:] = list(ython) >>>name ['P','y','t','h','o','n'] #分片可以在不替换任何原有元素的情况下插入新的元素 >>>numbers = [1,5] >>>numbers[1:1] = [2,3,4] >>>numbers [1,2,3,4,5] #分片也可用于删除元素 >>>number[1:4] = [] >>>number [1,5]
2.3 列表方法
1.append
append方法用于在列表末尾追加新的对象:(示例如下)
#append不是简单的返回一个修改过的列表——而是直接修改原来的列表 >>>lst = [1,2,3] >>>lst.append(4) >>>lst [1,2,3,4]
2.count
ocunt方法统计某个元素在列表中出现的次数(示例如下)
#统计元素出现的次数 >>>x = [[1,2],1,1,[1,2,3]] >>>x.coung(1) 2
3.extend
extend方法可以在列表的末尾一次性追加另一个序列中的多个值。换句话说,就是可以用新列表扩展原有的列表:
>>>a = [1,2,3] >>>b = [4,5,6] >>>a.extend(b) >>>a [1,2,3,4,5,6]
注意:这个操作看起来像是连接操作,两者最主要区别在于:extend方法修改了被扩展的序列(在这个例子中,就是a)。而原始的连接操作则不然,他会返回一个全新的列表。因此,链接操作的效率要比extend方法低。
4.index
index方法用于从列表中找出某个值第一个匹配项的索引位置。
5.insert
insert方法用于将对象插入到列表中。
6.pop
pop方法会移除列表中的一个元素(默认是最后一个值),并返回该元素的值:(示例如下)
>>>x = [1,2,3] >>>x.pop() 3 >>>x [1,2] >>>x.pop(0) 1 >>>x [2]
注意:pop方法是唯一一个即能修改列表又返回元素值(除了None)的列表方法。
使用pop方法可以实现一种常见的数据结构——栈。栈的原理:后进先出(这个原则称为LIFO)
栈的两个操作:入栈(push)和出栈(pop),python中没有入栈的方法,可以用append方法来代替。示例如下:
x = [1,2,3] x.append(x.pop(0)) print(x) # 结果:[2,3,1]
7.remove
remove方法用于移除列表中某个值的第一个匹配项,示例如下:
>>>x = ['to','be','or','not','be'] >>>x.remove('be') >>>x ['to','or','not','be']
注意:remove是一个没有返回值得原位置改变方法。它修改了列表却没有返回列表,这个方法与pop相反。
8.reverse
reverse方法将列表中的元素方向存放
注意:该方法也改变了列表但不返回值(就像remove和sort)
9.sort
sort方法用于在原位置对列表进行排序。改变了原来的列
>>>x = [1,3,2,5,4] >>>x.sort() >>>x [1,2,3,4,5]
当用户需要一个排好序的列表副本,同时有保留原有列表不变的时候,问题就出现了。为了实现这个功能,我们自然而然的想到了如下方法(实际是错误的):
>>>x = [4,6,2,1,7,9] >>>y = x.sort >>>y None
因为sort方法修改了x列表,但sort方法不返回值,所以最后得到的是已排序的x序列和置为None的y。
实现这个功能的正确方法是先把x的副本赋值给y,然后对y进行排序。如下列所示:
# 使用分片方法x[:]来获得x所有元素的分片 >>>x = [4,6,2,1,7,9] >>>y = x[:] >>>y.sort >>>x [4,6,2,1,7,9] >>>y [1,2,4,6,7,9] # 简单的把x赋值给y是没有用的,因为这样做就让x和y都指向了同一个列表了。 >>>x = [4,6,2,1,7,9] >>>y = x >>>y.sort >>>x [1,2,4,6,7,9] >>>y [1,2,4,6,7,9
另外一种获取已排序的列表副本的方法是,使用sorted函数
>>>x = [4,6,2,1,7,9] >>>y = sorted(x) >>>y.sort >>>x [4,6,2,1,7,9] >>>y [1,2,4,6,7,9
2.4 元组:不可变序列
元组与列表一样,也是一种序列。唯一不同的是元组不能修改。
1.tuple函数
以一个序列为参数并把它转换为元组
2.元组存在的意义
元组可以在映射和集合的成员中当作键使用——而列表则不行。