<<Python基础教程>>学习笔记 | 第02章 | 列表和数组

第02章: 列表和数组

------

在Python中最基本的数据结构是序列,每个元素分配一个序号,即元素的序号,也即索引。注意,需要从0开始,第一位0,第二位为1,依次类推. Python包括: 字符串,列表,元祖,字典 这四种常用数据结构,或者说四种序列,其中元祖为不可变序列.

列表和元祖的主要区别

  • 列表可变,而元祖不可变             >>>list1 = [‘Tom‘,40]
  • 所以元祖: 主要用于存储不变的数据   >>>
>>> tuple1 = (130,131,132,133,134)
>>> tuple1[0]=135

Traceback (most recent call last):
  File "<pyshell#199>", line 1, in <module>
    tuple1[0]=135
TypeError: 'tuple' object does not support item assignment
>>> list = ['Tom',40]
>>> list
['Tom', 40]
>>> list[0]='Jerry'
>>> list
['Jerry', 40]

再比如:要建个记录姓名,和年龄的元祖,可以这样:

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

------

通用序列可做的操作:

  • 索引
  • 切片
  • 增加元素
  • 删除元素
  • 更新元素
  • 查找元素(检查某个元素是否是序列中的一员)
  • 序列长度
  • 最大值
  • 最小值
  • 其他内建函数

------

索引

>>> greeting = ‘Hello World!‘

>>> greeting[0]

‘H‘

>>> greeting[-1]

‘!‘

如果只对年份的第四位感兴趣,可以这样:

>>> fouth = raw_input(‘Year: ‘)[3]

Year: 2008

>>> fouth

‘8‘

<span style="font-size:18px;">#Filename: showmonth.py

months = [
    'January',
    'February',
    'March',
    'April',
    'May',
    'June',
    'July',
    'August',
    'September',
    'October',
    'November',
    'December'
]

year    = raw_input('Year: ')
month   = raw_input('Month(1-12): ')
day     = raw_input('Day(1-31): ')

endings = ['st','nd','rd'] + 17*['th'] +           ['st','nd','rd'] + 07*['th'] +           ['st']

month_number = int(month)
day_number   = int(day)

month_name   = months[month_number-1]
ordinal      = day + endings[day_number]

print month_name[:3] + ' ' + ordinal + ', ' + year

# 输出结果
D:\>python showmonth.py
Year: 2014
Month(1-12): 09
Day(1-31): 13
Sep 13th, 2014
</span>

------

切片

>>> tag = ‘<a href="http://www.python.org">Python Web Site</a>‘

>>> tag[9:30]

‘http://www.python.org‘

>>> tag[32:-4]

‘Python Web Site‘

#输出最后三位,如要统计最后一位,其下一位必须被列出

>>> numbers[7:10]

[8, 9, 10]

#或者直接到:表示后面的

>>> numbers[7:]

[8, 9, 10]

#[:]或者[::]表示所有的

>>> numbers[-3:]

[8, 9, 10]

#倒序输出,步幅为-1,即从右到左

>>> numbers[-1:-4:-1]

[10, 9, 8]

#输出开始的三位

>>> numbers[:3]

[1, 2, 3]

#输出所有的

>>> numbers[:]

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#输出所有的另一种写法

>>> numbers[::]

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

例子:取http://www.something.com中的域名:

url = raw_input('Enter Url Here:')
Enter Url Here:http://www.sohu.com
print "Domain is:" + url[11:-4]
Domain is:sohu

------

更大步长

>>> numbers[0:10:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[0:10:2]
[1, 3, 5, 7, 9]
>>> numbers[::4]
[1, 5, 9]
>>> numbers[8:3:-1]
[9, 8, 7, 6, 5]
>>> numbers[10:0:-2]
[10, 8, 6, 4, 2]
>>> numbers[0:10:-2]
[]
>>> numbers[::-2]
[10, 8, 6, 4, 2]
>>> numbers[5::-2]
[6, 4, 2]

#序列相加,只有相同类型的才可以

>>> [1,2]+[3,4]
[1, 2, 3, 4]
>>> 'Hello,'+'World!'
'Hello,World!'
>>> [1,2]+'Hello'

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

------

乘法

#列表倍乘

>>> [0]*10
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
#字符串倍乘
>>> 'python'*5
'pythonpythonpythonpythonpython'

#序列初始化

>>> seq = [None]*10
>>> seq
[None, None, None, None, None, None, None, None, None, None]

字符串乘法例子

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

sentence     = raw_input("Sentence:")

screen_width = 80
text_width   = len(sentence)
box_width    = text_width +6

left_margin  = (screen_width-box_width)/2

print
print ' '*left_margin + '+' +'-'*(box_width-2)   + '+'
print ' '*left_margin + '| ' +' '*(text_width+2) + ' |'
print ' '*left_margin + '| ' + sentence  + ' '*2 + ' |'
print ' '*left_margin + '| ' +' '*(text_width+2) + ' |'
print ' '*left_margin + '+' +'-'*(box_width-2)   + '+'
print

D:\Work\Python>python showmonth.py
Sentence:I Love Python

                              +-----------------+
                              |                 |
                              | I Love Python   |
                              |                 |
                              +-----------------+

------

成员资格:

用in运算符号判断成员资格,在则为True,不在则为假:

>>> permissions='rw'
>>> 'w' in permissions
True
>>> 'x' in permissions
False
users=['root','test','guest']
print raw_input('Name:') in users
D:\>python showmonth.py
Name:root
True
>>> subject = '$$$ Get Rich Now! $$$'
>>> '$$$' in subject
True
database=[
    ['root','1234'],
    ['test','5678'],
    ['book','9012']
    ]

user = raw_input('Enter user: ')
puid = raw_input('Enter puid: ')

if [user,puid] in database:
    print 'Access Granted.'
else:
    print 'User or Pid not correct.'

------

长度,最大值,最小值

>>> n = [78,23,64]
>>> len(n);max(n);min(n)
3
78
23
可对多值进行比较
>>> min(9,3,2,5) ; max(9,3,2,5)
2
9

------

list函数

#将字符串转为由单个字符的列表
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
#将由字符组成的列表转成字符串
>>> list1=['d','a','y']
>>> ''.join(list1)
'day'

------

基本操作

#更新元素,赋值

>>> x = [0,1,2]
>>> x[0]=8
>>> x
[8, 1, 2]

Note:不能为一个不存在的索引的赋值,比如像上面的例子

>>> x[3]=3

Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    x[3]=3
IndexError: list assignment index out of range

#删除元素

>>> names=['Jerry','John','Jack','Alice']
>>> del names[3]
>>> names
['Jerry', 'John', 'Jack']

Note: del可以删除定义的各个变量,函数等

>>> s = '1234'
>>> def sum1(x,y):
	return x+y

>>> sum1(1,2)
3
>>> del s; del sum1
>>> s

Traceback (most recent call last):
  File "<pyshell#51>", line 1, in <module>
    s
NameError: name 's' is not defined
>>> sum1(1,2)

Traceback (most recent call last):
  File "<pyshell#52>", line 1, in <module>
    sum1(1,2)
NameError: name 'sum1' is not defined

分片赋值

#同长度赋值

>>> name=list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:]='ar'
>>> name
['P', 'e', 'a', 'r']

#不同长度赋值

>>> name=list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[1:]='ython'
>>> name
['P', 'y', 't', 'h', 'o', 'n']

#分片可以在不更改原值的情况下,插入新元素

>>> number = [1,5]
>>> number[1:1]=[2,3,4]
>>> number
[1, 2, 3, 4, 5]

#分片可以插入,也可以删除,相当于插入了‘空片‘

>>> number = [1,2,3,4,5]
>>> number[1:4]=[]
>>> number
[1, 5]
等价于 del number[1:4]

------

列表方法

append: 末尾添加

>>> num = [1,2,3]
>>> num.append(4)
>>> num
[1, 2, 3, 4]

count: 计算列表中元素出现的次数

>>> ['to','re','be','hi','to'].count('to')
2
>>> list1 = [[1,2],1,1,2,2,[2,1]]
>>> list1.count(1)
2
>>> list1.count([1,2])
1

extend: 列表后面添加新列表

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]

extend与列表相加的区别: extend改变了被添加列表的值,而直接相加则没有

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a + b
[1, 2, 3, 4, 5, 6]
>>> a
[1, 2, 3]

当然,也可以用切片的方式插入,但从程序可读性不如extend函数

>>> a = [1,2,3]
>>> a[len(a):] = [4,5,6]
>>> a
[1, 2, 3, 4, 5, 6]

index:从序列中找出第一个匹配项的索引值

>>> list1=['I','love','python','i','love','perl']
>>> list1.index('love')
1
>>> list1[1]
'love'
#如果没有的话,则会返回不在列的异常
>>> list1.index('java')

Traceback (most recent call last):
  File "<pyshell#54>", line 1, in <module>
    list1.index('java')
ValueError: 'java' is not in list

insert:在列表的特定位置插入项

>>> numbers = [1,2,3,5,6]
>>> numbers.insert(3,'four')
>>> numbers
[1, 2, 3, 'four', 5, 6]
#当然也可以用切片的方式来完成,但可读性不如insert
>>> numbers = [1,2,3,5,6]
>>> numbers[3:3]=['four']
>>> numbers
[1, 2, 3, 'four', 5, 6]

pop: 移除列表中的元素,默认的话是最后一位

Note:

  • pop是即能修改元素又能返回列表值(None除外)的函数
  • 可以append(pop(0))来实现FIFO功能
  • 也可以用insert(0...)配合pop来实现FIFO或者collection中的deque对象
>>> x = [1,2,3]
>>> x.pop()
3
>>> x
[1, 2]
>>> x.pop(0)
1
>>> x
[2]

pop可以实现栈(FIFO:先进先出,入栈(push)、出栈(pop))
pop 保持不变,push等价于append
>>> x = [1,2,3]
>>> x.append(x.pop())
>>> x
[1, 2, 3]

remove: 移除匹配中第一个元素值

Note:和pop相对,都是操作第一个匹配值,但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]

Note:如果要对一个列表实现反向迭代,可以用reversed,但该函数不返回具体值,

只是个迭代(iterator),但可以用list()函数列出来.

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

>>> list(reversed(x))

[3, 2, 1]

------

时间: 2024-10-19 11:51:54

<<Python基础教程>>学习笔记 | 第02章 | 列表和数组的相关文章

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简单的模块 #hello.py print ("Hello,World!") >>> import hello Traceback (most recent call last): File "<pyshell#56>", line 1, i

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第13章 | 数据库支持

备注:这章内容相对介绍的比较简单,不过例子比较使用,主要是要掌握如果连接,使用数据库,并以SQLite做示例 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,现在已经通过了一个标准的DB API.目前的API版本(2.0)定义在PEP249中的Python Database API Specification v2.0中. 异常 为了尽可能准确地处理错误,API中定义了一些异常.它们被定义在一种层次结构中,所以可以通过一个except块捕捉多种异常. 连

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第05章 | 条件、循环和其他语句

第05章 | 条件.循环和其他语句 ------ print 和 import #如果要打印多个语句,用,分割 >>> print "Name is:","Sherry.","Age is:",40 Name is: Sherry. Age is: 40 >>> print (1,2,3) #如果要打印元祖 (1, 2, 3) >>> print 1,2,3 #print语句会在每个元素间插入

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第14章 | 网络编程

Python是个很强大的网络编程工具,原因有二: 1. Python内有很多针对常见网络协议的库 2. Python在处理字节流方面的优势 本章主要内容: 探讨Python标准库中的一些网络模块,探讨SocketServer类,最后是Twisted框架. ------ 相关模块 Socket模块 基本组件,用于两个程序之间的信息通道.套接字包括两个: 服务器套接字和客户端套接字.创建一个服务器套接字后,让它等待连接,这样它就在某个网络地址处监听.客户端套接字负责:简单的连接,完成事务,断开连接.

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中,键可以使字符,数字,或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每个键都是由坐标值组成的元祖 存储文件修改的次数,文件名作为键 数字电话/地址薄 函数传递值def func(x,*args,**args): 如果要建公司员工与座机号的列表,如果要获得Alice的座机只能这么找 >>> names   = ['Alice','Bob','Tom'] >>> n

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第12章 | 图形用户界面

Python支持的工具包很多,但没有一个被认为标准的工具包,用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ 丰富的平台: Tkinter实际上类似于标准,因为它被用于大多数正式的Python GUI程序,而且它是Windows二进制发布版的一部分, 但是在UNIX上要自己编译安装. 另一个越来越受欢迎的工具是wxPython.这是个成熟而且特性丰富的包,也是Python之父,Guido van Rossu

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第11章 | 文件和素材

打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #如果文件不在,会报下面错误: >>> f = open(r'D:\text.txt','r') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'D:\\

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第08章 | 异常

------ 什么是异常:Python用异常对象(exception object)来表示异常情况.如果异常信息未被处理或捕捉. 程序就会用回潄来终止执行 >>> 1/0 Traceback (most recent call last): #Traceback: 一种错误信息 File "<stdin>", line 1, in ? ZeroDivisionError: integer division or modulo by zero 每个异常都是一