python自带了四种数据结构:列表、字典、元组、集合,本章主要介绍第一种:列表。

列表:有序的、可变的对象集合

动态的:长度可以随时变化

异构的:数字与字符串等不同类型的变量可以存在一个列表里

元组:有序的、不可变的对象集合

简单来说就是一个常量列表。

字典:无序的键值对集合

就类似C++里面的map。注意字典增加元素的插入顺序没有任何意义。在一个字典中,键的值是唯一的。

集合:无序的、唯一对象的集合

类似C++中的set。但是是没有顺序的。

1、in操作符

使用in操作符来判断某个集合中是否存在某元素。

使用not in操作符来判断某个集合中是否不存在某元素。

这就和STL中的exist函数类似,使用方法为

if a in A:
    print(a)
if a not in B:
    print(a)

和if搭配使用。

2、列表的函数

append函数:

类似push函数,负责在列表的尾端添加元素。

remove函数:

参数为列表中元素的值,其效果为删除该值的第一次出现,也就是说,对于12233355这样一个列表,执行remove(5)之后列表会变为1223335,第一个5被删除了。

pop函数:

比C++的pop函数功能要强大。首先,默认没有参数的pop函数不但会删除列表的最后一个元素,而且会返回该元素的值;其次,若pop有一个参数,它会删除在参数位置的元素,并返回其值。也就是说,pop的参数就是元素的下标,也就是索引值。

extend函数:

用于合并两个列表,其参数就是一个列表。若参数是空列表,则不会有任何改变,与之形成对比的则是append函数,它的参数如果是一个空列表“[]”,那么就会在原来列表的尾巴加一个空列表。

insert函数:

有两个参数,第一个参数是索引值,第二个参数是元素值。其用途就是新建一个列表元素,其值是参数中的元素值,把这个列表元素插到索引值之前。

3、练习

书中给出了一个练习,仅使用以上四个函数,将字符串“Don't panic!”转换为“on tap”。

我的代码如下:

phrase="Don't panic"
plist=list(phrase)
print(phrase)
print(plist)
delspace=plist.pop(5)
plist.remove('D')
plist.remove("'")
deln=plist.pop(1)
plist.remove('n')
plist.remove('i')
plist.remove('c')
plist.insert(1,deln)
plist.insert(2,delspace)
dela=plist.pop()
plist.insert(4,dela)
new_phrase=''.join(plist)
print(plist)
print(new_phrase)

问题就是删除或者掉换一些元素的位置。

基本思路就是把空格、n、a用pop提取出来并保存,因为它们都是要调换位置的;剩余的该删的,就用remove删了,不删的就留下。然后用insert再重新插入。很麻烦。

推荐代码如下:

phrase="Don't panic"
plist=list(phrase)
print(phrase)
print(plist)
for i in range(3):
    plist.pop()
plist.pop(0)
plist.remove("'")
plist.extend([plist.pop(),plist.pop()]
plist.insert(2,plist.pop(3))
new_phrase=''.join(plist)
print(plist)
print(new_phrase)

首先,它用一个循环,利用pop删除了末尾的三个元素;然后利用pop删除头元素;这些都还好;我觉得值得学习的一句如下:

plist.extend([plist.pop(),plist.pop()]

这句话的效果是把ont pa变成了ont ap,也就是说,交换了最后两个元素的位置,这里应用了pop会返回元素值的特点,利用两次pop,返回了两个值,当然它们的顺序与在列表中返回了,然后用[]打包一下,用extend函数直接合并即可。十分简洁。

这里的join函数可以理解为把列表转换成了字符串。list函数把字符串转换成了列表。

4、列表的复制

注意,python中,有两种,第一种是直接使用=,如下:

A=[1,2,3]
B=A

这种情况下,B相当于一个指针,指向A,按C++来说,B是A的引用,也就是说,如果对B进行操作,也就是对A进行了同样的操作。

第二种是使用copy函数,如下:

A=[1,2,3]
B=A.copy()

这种情况下,copy函数类似C++中的拷贝构造函数,也就是说把A的一份复制给B,这样对B的操作也就不会影响到A了。

5、列表的索引

列表可以用中括号记法,当索引值为正数时,这与其他语言类似;但是索引值也可以为负数,当索引值为负数时,表示从后往前数。也就是说,A[-1]表示列表A的最后一个元素,-2代表尾二等。

类似range,列表也可以用start、stop、step这三个参数,但是在range中它们使用,隔开,列表的[]中,它们使用:隔开。

如果使用这种记法,相当于是一个函数,返回符合要求的一部分。

有以下几种用法:

A="Don't panic!"
A[0:10:3]#返回D'pi
A[3:]#返回't panic!
A[:10]#返回Don't pani
A[::2]#返回Dntpnc

当三个参数都有值时,按参数内容控制返回;三参数的默认值为0,列表允许的最大值,1。

当只有start有值时,仅需[start:]即可,只需一个冒号:,如果start为正,则代表着从前往后数第start个元素开始,一直到最后为止,如果start为负,则代表着从后往前数,第-start个元素开始,一直到最后为止,注意不是最前;

当只有stop有值时,仅需[:stop]即可,也只需一个冒号:;

当只有step有值时,则需[::step],需要两个冒号::。

另外,python的注释是用#,单行注释;""",三双引号,多行注释;''',三单引号,多行注释的。

在python2中,如果代码中有中文,还要在开头加coding=utf-8,但python3中就不用了。

使用这种方法返回的列表的一部分,称为列表的“切片”。

6、练习

类似上一个练习,再次把"Don't panic!"转换为"on tap"。

我的代码如下:

phrase="Don't panic!"
plist=list(phrase)
print(phrase)
print(plist)
plist1=plist[1:3]
print(plist1)
plist2=plist[5:3:-1]
print(plist2)
plist3=plist[7:5:-1]
print(plist3)
plist1.extend(plist2)
plist1.extend(plist3)
plist=plist1.copy()
phrase=''.join(plist)
print(plist)
print(phrase)

我的思路就是,拿出三个切片,然后利用extend合并。

有一点要注意,extend没有返回值,因此如果写出了plist=plist.extend(plist1)这种代码,编译器会报错。因为这会将plist变为空,这样它就不再是一个列表,也就没有insert等函数了。

推荐代码如下:

phrase="Don't panic!"
plist=list(phrase)
print(phrase)
print(plist)
new_phrase=''.join(plist[1:3])
new_phrase=new_phrase+''.join([plist[5],plist[4],plist[7],plist[6]])
print(plist)
print(new_phrase)

仅用了两行,但它并没有更改plist的内容,仅是新建了一个变量,然后print这个变量。

使用了两次join函数,第一次拿出了on,第二次利用运算符+连接两个字符串,join的参数是一个列表,列表的元素则是四个plist列表的元素,将它们一个一个从plist中拿出,然后合成一个新的列表,再转换成字符串,然后连接。

这就相当于利用下标直接提取元素,我蠢了,只会笨比的的用切片,实际上直接利用下标更简单。

这也可以看出,python十分不喜欢用临时变量。要注意这一点。

7、列表的迭代

有两种方式,类似for循环的两种方式。

第一种就像for a in A,循环自己知道,是从列表的第一个元素开始,循环到最后一个元素位置,不用我们去告诉它任何事。

第二种是对切片循环,也就是for a in A的切片,本质上与上一个也一样,因为A的切片返回的也是一个列表。

举例如下的代码:

A="Hello world!"
for char in A[:-3]:
    print('\t',char)
print()
for char in A[-7:]:
    print('\t'*2,char)
print()
for char in A[::-3]:
    print('\t'*3,char)

其效果如下:

python无序数组 python有序数组_操作符

也就是说,stop为负表示从左到右,从头开始,到stop位置停止,不包括stop;start为负表示从左到右,从start开始,到末尾停止;step为负表示从右到左,按step跳过元素。

即,staart和stop的正负不影响读取顺序,step的正负才影响读取顺序。

另外。print(),表示空一行,'/t'表示制表符,可以用*2,*3表示多个,很方便。