`

python学习笔记3——第二章 序列

阅读更多

第二章   序列

 

1. 序列——python最基本的数据结构

>>> edward = ['Edward Gumby', 42]
>>> john = ['John Smith', 50]
>>> database = [edward, john]
>>> database
[['Edward Gumby', 42], ['John Smith', 50]]

 

 2. 序列操作

(1)索引

>>> greeting = 'Hello'
>>> greeting[0]    #从左边开始计数,从0开始依次递增
'H'
>>> greeting[4]
'o'
>>> greeting[-1]  #从右边开始计数,从-1开始依次递减
'o'
>>> greeting[-5]
'H'
>>> 'Hello'[1]  #对字符串直接使用索引
'e'
>>> fourth = raw_input('Year: ')[3]
Year: 2011
>>> fourth
'1'

 

   应用索引的一个完整示例

#根据给定的年月日以数字形式打印日期
months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',
          'August', 'Semptember', 'October', 'November', 'December']
#以1~31的数字作为结尾的列表
endings = ['st', 'nd', 'rd'] + 17 * ['th']\   #"\"表示该行未完
         + ['st', 'nd', 'rd'] + 7 * ['th']\
         + ['st']
year = raw_input("Year: ")
month = raw_input("Month(1-12): ")
day = raw_input("Day(1-31): ")
month_number = int(month)
day_number = int(day)
#将月份和天书减1,以获得正确的索引
month_name = months[month_number - 1]
day_name = day + endings[day_number - 1]

print month_name + ' ' + day_name + ',' + year

#运行结果
Year: 2011
Month(1-12): 9
Day(1-31): 5
Semptember 5th,2011

 

(2)分片

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]   #索引左边从0开始递增,右边从-1开始递减
>>> numbers[7:10]     #(1)开始点的元素包含在结果内,而不包含结束点元素
[8, 9, 10]
>>> numbers[-3:-1]    #同样也可使用负数来表示,但因不含结束点元素,所以无法得到与(1)同样效果
[8, 9]
>>> numbers[-3:0]     #开始点索引比结束点索引晚出现在序列中,结果为空序列,倒数第三个比第一个数出现晚
[]
>>> numbers[-3:]       #与(1)效果相同,若要包括序列结尾元素,只需置空结束点索引即可。
[8, 9, 10]
>>> numbers[:3]        #同样,可将开始点索引置空
[1, 2, 3]
>>> numbers[:]          #均置空,实现序列复制
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
#步长
>>> numbers[0:10:1]    #默认情况下步长为1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[0:10:2]    #步长为2
[1, 3, 5, 7, 9]
>>> numbers[::2]    #(2)开始点和结束点为空时,默认从开头取至结尾[1, 3, 5, 7, 9]
>>> numbers[10:0:-1]   #步长可以为负数,但要保证开始点索引比结束点大
[10, 9, 8, 7, 6, 5, 4, 3, 2]
>>> numbers[10:0:-2]
[10, 8, 6, 4, 2]
>>> numbers[::-2]   #同(2),但因为从右往左,所以开始点为空默认从序列头部10,结束点为空默认为尾部0
[10, 8, 6, 4, 2]
>>> numbers[10::-2]  #同理
[10, 8, 6, 4, 2]
>>> numbers[:0:-2]  #同理
[10, 8, 6, 4, 2]

 

(3)加法——只有同类型的序列才可以相加(连接)

>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> "Hello. " + "world!"
'Hello. world!'
>>> [1, 2, 3] + "world!"

Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    [1, 2, 3] + "world!"
TypeError: can only concatenate list (not "str") to list

 

(4)序列乘以一个数n,生成新序列,重复原序列n次。

>>> "python" * 5
'pythonpythonpythonpythonpython'
>>> [42] * 5
[42, 42, 42, 42, 42]
>>> [None] * 5    #占用5个元素的空间,却不包含任何内容,None注意首字母大写
[None, None, None, None, None]

 

    乘法的一个实例

#以正确的宽度在居中的”盒子“内打印一个句子

sentence = raw_input("Sentence: ")
screen_width = 80
text_width = len(sentence)  #len():获取序列长度
box_width = text_width + 6
left_margin = (screen_width - box_width) // 2  #"//"整除,使得box在screen中居中

print
print ' ' * left_margin + '+' + '-' * (box_width - 2) + '+'
print ' ' * left_margin + '|' + ' ' * (box_width - 2) + '|'
print ' ' * left_margin + '|' + '  ' + sentence + '  |'
print ' ' * left_margin + '|' + ' ' * (box_width - 2) + '|'
print ' ' * left_margin + '+' + '-' * (box_width - 2) + '+'
print
 
#显示结果
Sentence: Hello world

                               +---------------+
                               |               |
                               |  Hello world  |
                               |               |
                               +---------------+

 

(5)成员资格——检查一个值是否存在于序列中

>>> permission= 'rw'   
>>> 'w' in test    #可用于检查文件是否可读写
True
>>> 's' in test
False
>>> users = ['mlh', 'foo', 'bar']
>>> raw_input("Enter your name: ") in users  #检查用户是否在列表中
Enter your name: mlh
True
>>> 'test' in 'yourtest'  #直接检查
True

 

   完整示例

#检查用户名和PIN码
database = [
    ['albert', '1234'],
    ['dilbert', '2345'],
    ['simith', '3456'],
    ['johns', '4567']
    ]
username = raw_input("user name: ")
pin = raw_input("PIN code: ")
if [username, pin] in database: print "Access granted"
else: print "Access rejected"

#运行结果
 >>> 
user name: alber
PIN code: 1234
Access rejected
>>> ================================ RESTART ================================
>>> 
user name: albert
PIN code: 1234
Access granted

 

(5)len(), max(), min()

>>> numbers = [2, 3, 5]
>>> len(numbers)
3
>>> max(numbers)
5
>>> min(numbers)
2
>>> max(2,4,9)
9
>>> min(1, 4, 5)
1

 

3. 列表——可进行修改

   因为字符串不能被修改,所以将字符串转换为列表后进行修改

(1)列表操作

>>> list("Hello")   #list()将字符串转为列表
['H', 'e', 'l', 'l', 'o']

>>> x = [1, 1, 1]
>>> x[1] = 2    #根据索引赋值,直接修改内容
>>> x
[1, 2, 1]

>>> del x[2]  #del删除元素
>>> x
[1, 2]

>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[1:] = list('ython')    #使用分片进行赋值,长度可以与原长度不同
>>> name
['P', 'y', 't', 'h', 'o', 'n']

>>> name[0:0] = list('Hello ')  #插入
>>> name
['H', 'e', 'l', 'l', 'o', ' ', 'P', 'y', 't', 'h', 'o', 'n']

>>> name[0:6] = []   #相当于del
>>> name
['P', 'y', 't', 'h', 'o', 'n']
#还可以使用步长,负数索引等。

 

(3)列表方法——与函数的不同,方法是与对象紧密联系的函数

#append()在列表末尾追加元素,它直接修改列表,而不是生成新的列表
>>> lst = [1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]

#count()统计元素在列表中出现次数
>>> ['to', 'be', 'or', 'to'].count('to')
2
>>> x = [[1,2], 1, 1, [2, 1, [1, 2]]]
>>> x.count(1)
2
>>> x.count([1,2])
1

#extend()将一个列表B追加到另一个列表A之后,修改原列表A
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)   #a列表被修改
>>> a
[1, 2, 3, 4, 5, 6]

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b             #a列表未被修改,生成了一个包含a和b的副本的新列表
[1, 2, 3, 4, 5, 6]     #若用a = a + b,效率比extend低
>>> a
[1, 2, 3]

>>> a[len(a):] = b   #用分片可以实现对a列表的修改,可读性差
>>> a
[1, 2, 3, 4, 5, 6]

#index()找出匹配项的第一个索引位置
>>> a = ['1', '2', '3', '1']
>>> a.index('1')
0

#insert()插入
>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers.insert(3, 'four')  #在索引3之前插入,插入到第三个元素之后
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]

>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers[3:3] = ['four']   #分片实现插入,同样在在索引3之前插入,但可读性差
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]


>>> #pop()移除列表元素(默认最后一个),并返回该元素的值,是唯一一个及修改列表又返回元素值的列表方法
>>> #可以用pop()构造栈,用append模拟push,先入后出
>>> x = [1, 2, 3]
>>> y = x.pop()
>>> y
3                         #输出的是要移除的元素值
>>> x.append(y)
>>> x
[1, 2, 3]

#上述可写成
>>> x.append(x.pop())   #pop后又加入,相当于不变
>>> x
[1, 2, 3]
>>> 


#remove()删除第一个匹配项
>>> x = ['to', 'be', 'or', 'not', 'to', 'be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']


#reverse()将列表中元素反向存放
>>> x = [1, 2, 3]
>>> x.reverse()
>>> x
[3, 2, 1]


#sort()对原列表进行排序,原列表发生改变
>>> x = [4, 6, 2, 1, 7, 9]
>>> x.sort()
>>> x
[1, 2, 4, 6, 7, 9]
>>> 
#如何实现排序副本,并保持原列表不变呢
#错误方法
>>> x = [4, 6, 2, 1, 7, 9]
>>> y = x.sort()  
>>> print y
None   #因为sort()无返回值
#正确方法
>>> x = [4, 6, 2, 1, 7, 9]
>>> y = x[:]   #高效的复制方法,单纯的将x赋值给y是没用的,这用是x、y都指向同一个列表
>>> y.sort()
>>> x             #x未发生改变
[4, 6, 2, 1, 7, 9]
>>> y             #只对x的副本y进行了排序
[1, 2, 4, 6, 7, 9]
>>> 
#sorted()另一种获取副本的方法
>>> x = [4, 6, 2, 1, 7, 9]
>>> y = sorted(x)
>>> x
[4, 6, 2, 1, 7, 9]   #x未发生改变
>>> y
[1, 2, 4, 6, 7, 9]   #只对x的副本y进行了排序
>>> #简单写法
>>> sorted(x)   #x未变,只对x的副本排序
[1, 2, 4, 6, 7, 9]

>>> 
>>> cmp(2,1)  #cmp(x,y),当x>y时,返回正数
1
>>> cmp(1,2)  #当x<y时,返回负数
-1
>>> cmp(1,1)  #当x=y时,返回0
0
>>> 
>>> #cmp作为sort的参数????????
>>> numbers = [2, 9, 3 ,6]
>>> numbers.sort(cmp)  #不明白???与一般的.sort()有什么区别??
>>> numbers
[2, 3, 6, 9]
>>> 
>>> #sort()的可选参数,key和reverse
>>> x = ['ab', 'abc', 'a', 'abcd']
>>> x.sort(key=len)  #以元素的长度来排序
>>> x
['a', 'ab', 'abc', 'abcd']
>>> 
>>> x = [4, 6, 2, 1, 7, 9]
>>> x.sort(reverse=True)  #反向排序
>>> x
[9, 7, 6, 4, 2, 1]

 

4. 元组——不可变的序列

   元组用()表示,而列表用[]表示

>>> 1, 2, 3   #用逗号隔开即可创建新元组
(1, 2, 3)
>>> (1, 2, 3)  #同上
(1, 2, 3)
>>> ()   #空元组
()
>>> 42  #数字
42
>>> 42,  #添加逗号,就变成了只有一个元素的元组
(42,)
>>> (42,)   #同上
(42,)
>>> (42)  #没有逗号只有括号,同样是数字,而不是元组
42
>>> 3 * (40 + 2)  #数字计算
126
>>> 3 * (40 + 2,)  #元组相乘
(42, 42, 42)


#tuple()以一序列作为参数,将其转换为元组
>>> tuple([1, 2, 3])  #列表转换为元组
(1, 2, 3)
>>> tuple('abc')   #字符串转换为元组
('a', 'b', 'c')
>>> tuple((1,2,3))   #元组转换为元组
(1, 2, 3)

#一些基本操作
>>> x = 1, 2, 3
>>> x[1]   #根据索引取值
2
>>> x[0:2]   #分片,元组分片后仍为元组,而列表分片后仍未列表
(1, 2)

 

5. 元组不可修改,与列表相比存在的意义?

   (1)元组可以在映射中当键使用,而列表不可以

   (2)很多内建函数和方法的返回值都是元组

 

6. 总结

   列表和元组都属于序列,列表可以修改,元组不可变。内容比较简单,同样繁琐易忘

 

涉及函数

cmp(x,y)  比较x,y

len(seq)  返回序列长度

list(seq)  序列转为列表

max(args)

min(args)

reversed(seq)  对列表反响迭代

sorted(seq)  返回原列表的排序列表副本   x.sort()   属于方法,而不是函数

tuple(seq)序列转为元组

 

 

 

分享到:
评论

相关推荐

    Python 笔记源码——内含python后端&机器学习等.zip

    Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip ...

    Python学习笔记——运算符

    Python学习笔记——运算符 运算符: 赋值运算符 算术运算符 关系运算符 逻辑运算符 位运算

    Python学习笔记——输入input()

    Python学习笔记——输入input(),input()使用,两个练习。

    [实训解析]Python 计算思维训练——SAR图像处理-第2关:读入一个目录下所有图像_5307.pdf

    "[实训解析]Python 计算思维训练——SAR图像处理-第2关:读入一个目录下所有图像_5307.pdf" 该标题表明,这是一个 Python 计算思维训练的实践解析,重点在于SAR图像处理,并且是第二关,主题是读取一个目录下所有...

    最新Python学习笔记3

    reduce()函数的工作方式是将第一个参数的函数应用于序列的第一个和第二个元素,然后将该函数应用于得到的结果和序列的下一个元素,依此类推,直到整个序列处理完毕。最终,reduce()函数返回一个单一的值。 filter()...

    Python学习笔记(干货) 中文PDF完整版.pdf

    这份"Python学习笔记"涵盖了从环境搭建到基础语法,再到数据类型和控制结构等关键知识点,旨在为初学者提供全面的学习指导。 首先,1.1章节介绍了Python的基础,包括Python的起源和历史。Python是由Guido van ...

    用Python学习线性代数——向量

    用Python学习线性代数——向量在Jupyter Notebook下运行的文件,内容包括行列向量的基本表示,向量的基本运算等。详情请见https://tuenity.blog.csdn.net/article/details/104070768。

    Python学习笔记.pdf

    **标题与描述解析:** "Python学习笔记.pdf" 的标题直接指出了文档的主题——Python的学习资料,而描述的重复表明该文档的主要内容即为Python的学习笔记。标签 "Python" 进一步强调了主题。 **知识点:** 1. **...

    皮大庆Python学习笔记

    Python基础入门教程,适合Python初学者,文档内容包括, 目录 前言 i 第一章 程序 1 1.1 程序 . . . . . ....1.2 什么是调试 ....1.3 调试 .... 3 1.4 程序语言和自然语言 ....1.5 第一个程序 ....第二章 变量,表达式和语句 6

    Python高效开发实战——Django、Tornado、Flask、Twisted 本书源代码

    Python高效开发实战——Django、Tornado、Flask、Twisted 本书源代码 Python高效开发 实战 也许你听说过全栈工程师,他们善于设计系统架构,精通数据库建模、通用网络协议、后端并发处理、前端界面设计,在学术研究...

    python训练营python学习笔记(csdn)————程序.pdf

    在“Python训练营Python学习笔记”中,我们将会探讨一些基本的编程概念和操作,包括变量、运算符、数据类型以及位运算。 1. **变量、运算符与数据类型** 变量是存储数据的容器,你可以将其想象为一个可以改变的...

    python项目——智慧校园考试系统.zip

    python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园...

    Python期末大作业——采用Neo4j的基于协同过滤电影推荐系统.zip

    《Python期末大作业——采用Neo4j的基于协同过滤电影推荐系统》是一个综合性的项目,旨在教授学生如何利用Python编程语言、大数据处理技术以及Neo4j图数据库来构建一个电影推荐系统。该项目不仅包含了完整的源代码,...

    effective python学习笔记.pdf

    记录了我的effective-Python学习笔记,精简了effective-Python中重要的部分。effective-Python是一本值得多看几遍的书,但是看后面的几遍的时候完全可以直接看自己的学习笔记。此学习笔记侧重与比较实用的部分即前四...

    Python学习笔记--皮大庆

    Python学习笔记--皮大庆

    Python学习之极简笔记——从零到催生AGI.zip

    Python学习之极简笔记——从零到催生AGI

Global site tag (gtag.js) - Google Analytics