1. 列表list
列表是有序的元素集合,元素的数据类型可以不一样,元素本身也可以是列表。
a. 标志
列表的标志是[ ],如
#list
list1 = ['a', 'b', 5]
list2 = [list1, 'abc', 3]
b. 常用操作
创建列表
- 直接给元素
list1 = ['a', 'b', 'c] - 先创建一个空列表,再向列表中插入元素
list1 = []
list1.append('a') or list1.insert(0, 'a') - 如果要生成的列表中各元素相同可以用*,如list1 = ['H']*4就得到['H','H','H','H']
- 如果要生成的列表中各元素之间有规律可以用列表生成式(List Comprehensions),如以下几个例子
要生成[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
可以用list1 = list(range(1,11));
要生成[1x1, 2x2, 3x3, ..., 10x10]可以用
list1 = [x*x for x in range(1,11)];(可以加循环)
要生成[2x2, 4x4, ..., 10x10]可以用
list1 = [x*x for x in range(1,11) if x % 2 == 0];(可以加if进行筛选)
要生成['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ']可以用list1 = [x+y for x in 'AB' for y in 'XYZ'];(可以用两层循环,再多层一般不用) - 将其他类型的数据转换成列表
字符串转列表:(1)将单个字符当作list里的元素用list1 = list(str),如str = 'abcde',list = list(str),list1就是['a', 'b', 'c', 'd', 'e'];(2)将字符串拆成多个字符串,分别作为list里的元素用list1 = str.strip('分隔符'),如image ='1.jsp,2.jsp,3.jsp,4.jsp',image_list = image.strip(',').split(','),则image_list就是['1.jsp', '2.jsp', '3.jsp', '4.jsp']。
numpy.array转列表:list1 = array.to_list()
tuple转列表:list1 = list(tuple1)
统计元素个数
L = len(list1) #统计列表中元素的个数
索引列表中的元素
- 按索引找到单个元素
正序数从0开始,到len(list1)-1结束,list1[0],list1[1],list1[len(list1)-1];
逆序数从-1开始,到-len(list1)结束,list1[-1],list1[-2],list1[-len(list1)];
如果索引超出范围会报错:“IndexError: list index out of range”。 - 按索引取出多个元素用切片,切片同样适用于tuple和string这两种特殊列表
list1[a:b:gap]为取list1的第a到b-1(注意不是b)的元素,取的时候元素间隔为gap,后面的:gap可以不写,此时为间隔为1
若取前5个元素,可以写成list1[0:5],也可以缺省list1[:5]
若取后5个元素,不能写成list1[-5:-1],而应该写成list1[-5:],因为前者最后一个元素取不到
直接list1[:]就是一个浅拷贝 - 遍历所有的元素
for item in list1: item直接就是list1中的各元素,而不需要通过索引来遍历
向列表中插入元素
- 追加元素到末尾
list1.append(element),注意不是list1 = list1.append('xyz')。append() 追加单个元素到List的尾部,只接受一个参数,参数可以是任何数据类型,被追加的元素在List中保持着原结构类型。此元素如果是一个list,那么这个list将作为一个整体进行追加,注意和extend()的区别。 - 向指定索引位置插入元素
list1.insert(i, element),注意不是list1 = list1.insert(0,'xyz'),指定下标及后面的元素全部往后移动一个下标。 - 将一个list B中的各元素逐个添加到list A的后面,相当于是将list B 连接到list A上
listb.extend(lista) 将列表b中每个元素分别添加到列表a中,list1 = ['a','b','c'], list2 = ['d','e','f'], list1.extend(list2), list1就是['a','b','c','d','e','f'],而list1.append(list2)是['a','b','c',['d','e','f']] - listc = lista + listb,功能与extend一致,但会创建新的对象
前面三种方法(append, insert, extend)可对列表增加元素的操作,他们没有返回值,是直接修改了原数据对象。 + 加号,将两个list相加,会返回到一个新的list对象,需要消耗额外的内存,尽量不要使用。
从列表中删除元素
- 删除末尾的元素
list1.pop() - 删除指定索引的元素
list1.pop(i) 或者 del list1[i](pop还可以返回被删除的元素a = list1.pop(i);del不是list的方法,而是python中的函数,因而不能被list调用) - 删除指定的元素
list1.remove(element)
列表的拷贝
定义lista = [2,[4,5]] #在内存中创建了一个[2,[4,5]]的列表,在内存中创建了一个名为lista的变量,并让lista指向[2,[4,5]
lista=listb 是重命名而不是拷贝!!!创建了b,指向a所指向的列表,b的内容和a的内容完全一样,后续对b进行修改a也会同步
真正的列表的拷贝有以下5种方式:
1.listb = lista[:] #切片赋给新变量相当于浅拷贝
2.listb = list(lista)
3.listb = [i for i in lista]
4.import copy; listb = copy.copy(lista) #浅拷贝,内部的不可变元素被拷贝,可变元素如list拷贝的只是地址,和原始list相同
5.import copy; listb = copy.deepcopy(lista) #深拷贝,是真正意义上的拷贝,二者完全不同了
每种拷贝方式后续跟两步操作:
listb[1].append(9)
print(lista, listb)
五种拷贝方式后续操作的结果分别是:
1. [2, [4, 5, 9]] [2, [4, 5, 9]]
2. [2, [4, 5, 9]] [2, [4, 5, 9]]
3. [2, [4, 5, 9]] [2, [4, 5, 9]]
4. [2, [4, 5, 9]] [2, [4, 5, 9]]
5. [2, [4, 5]] [2, [4, 5, 9]]
c. 其他函数和方法
(函数是指函数(list),方法是指list.方法)
需要注意的几个函数包括:len(list)列表元素个数,cmp(list1, list2)比较两个列表的元素,max(list)返回列表元素最大值,min(list)返回列表元素最小值。
直接敲help([])可以查看列表的所有方法,其中需要注意的几个方法包括:
| clear(...)
| L.clear() -> None -- remove all items from L
|
| copy(...)
| L.copy() -> list -- a shallow copy of L
|
| count(...)
| L.count(value) -> integer -- return number of occurrences of value 返回元素在列表中出现的次数
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value. 从列表中找出某个值第一个匹配项的索引位置
| Raises ValueError if the value is not present.
|
| reverse(...)
| L.reverse() -- reverse *IN PLACE*
|
| sort(...)
| L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE* . reverse=False(默认)ASCII升序,reverse=True降序
2. 元组tuple
tuple和list非常类似,但是tuple是不可变的,一旦初始化就不能修改,所以更安全。
a. 标志
元组的标志是( ),如
#tuple
classmates = ('Michael', 'Bob', 'Tracy', 2)
b. 基本操作
创建元组
- 直接给元素
tuple1 = ('a', 'b', 'c', 2),空元组tuple1 = (),注意只有一个元素的元组是tuple1 = ('x',) 以避免和小括号运算混淆。 - 将其他类型的数据转换成元组
列表转tuple:tuple1 = tuple(list1) - 不能先创建一个空元组,再向元组中插入元素,因为元组是不可变的,所以没有插入元素的方法
统计元素个数
L = len(tuple1) #统计元组中元素的个数
索引元组中的元素
与列表的索引方式相同,但是列表被索引出来的元素可以重新赋值,而元组不可以。另外,不允许向元组中插入元素,也不允许从元组中删除元素。
元组不可变性的进一步解释
tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。元组中如果有list元素的话,这个list是可以变的:
t = ('a', 'b', ['A', 'B'])
t[2][0] = 'X'
t[2][1] = 'Y'
print(t)
('a', 'b', ['X', 'Y'])
3. 字符串string
- 字符串是以单引号
'
或双引号"
括起来的任意文本,比如'abc'
,"xyz"
等等。其中''
或""
本身只是一种表示方式,不是字符串的一部分。 - 字符串中有些字符需要用转义字符来表示,转义字符包括:
\n
表示换行,\t
表示制表符,\\
表示\,\'表示',\"表示"等。
如果不想要转义,用在字符串引号之前加上r,如r'text1'或r'''line1...line2...line3'''。
-
有多行换行的字符串可以用'''line1...line2...line3'''
的格式来替代\n(注意这里的...和交互式时的...不一样)
。
a. 字符编码
字符编码就是指将文本形式的字符变成计算机可以进行处理和存储的数字的形式。
由于计算机中的数字是以二进制存储的,二进制只有0和1两个数字,没有办法表示这么多的字符,所以通过多个二进制数字的组合来表示字符。根据每种语言字符数量的多少,不同的国家有自己的字符编码,如:
语言 | 字符编码方式 | 字符编码的比特数 | 所能表示的最大整数 | 编码的字符数 |
英文 | ASCII | 8比特(1字节) | 255 | 127 |
中文 | GB2312 | 16比特(2字节) | 65535 | |
日文 | Shift_JIS | | | |
韩文 | Euc-kr | | | |
但当一个文本中含有多种语言时,每种语言对应自己的字符编码这种方式就会导致编码混乱,因此有了各语言统一的编码方式:
Unicode和UTF-8编码的关系是:在内存中,统一使用Unicode编码;当保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
b. 转义字符
转义字符 | 描述 |
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\' | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
c. 基本操作(+,*,读取方式)
对字符串的操作不要忘记re模块里的正则表达式的一些办法,包括字符串的正则匹配、字符串切分(变成规则的list)、字符串的分组(子串提取)、字符串的非贪婪匹配(与正则表达式是贪婪匹配相对)等。