列表和元组

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.元组存在的意义

  元组可以在映射和集合的成员中当作键使用——而列表则不行。

 

 

  

 

posted on 2016-01-21 01:06  揉碎的青春  阅读(449)  评论(0编辑  收藏  举报

导航