列表定义
之前的文章里我们已经讲过了数字和字符串, 它们是两种很基本的对象, 今天要学的 list 也是一种对象, 它在 Python 中具有非常强大的功能.
在 Python 中, 列表用一对方括号 -- [] 表示, 在方括号里你可以数字, 字符串也可以是其他对象, 甚至可以是多种不同的对象. 除此以外, 列表中元素的个数可以无限大, 当然这是理想状态, 我们总还是要看硬件设备的脸色行事.
- >>> a = []
- >>> a
- []
- >>> b = ['1',2,'abcd']
- >>> b
- ['1', 2, 'abcd']
- >>> c = [1,'asd',[1,2,3]]
- >>> c
- [1, 'asd', [1, 2, 3]]
索引和切片
还记得什么是索引和切片吗? 如果忘记了, 请回头去看这篇文章 -- 零基础学习 Python 之字符串 .
列表和字符串一样, 都是序列, 列表里的元素也是有顺序的, 所以也是有索引和切片的, 看看下面的例子就明白了.
- >>> a = [1,'2','rocky']
- >>> a[0]
- 1
- >>> a[1]
- '2'
- >>> a[:3]
- [1, '2', 'rocky']
- >>> a[1:3]
- ['2', 'rocky']
- >>> a[2][0:3]
- 'roc'
由上面的例子我们可以看出来, 其实列表里的索引和序列与字符串里的是一样的, 我们完全可以把之前在字符串中的理解照搬过来, 所以列表也可以从右向左编号, 依次是 -1,-2,-3... 但是如果要是切片的话, 这里要注意了, 请看下面的例子:
- >>> str = ['abc','bcd','123']
- >>> str[-3:-1]
- ['abc', 'bcd']
- >>> str[-1:-3]
- []
看明白了吗? 序列都是从左向右排, 不管你的下标是正的还是负的都是这个规律.
当然了序列里还可以跳步, 其实它的完整的写法是 list[start:end:step], 默认 step = 1 .
- >>> str = [1,2,3,4,5,6,7,8]
- >>> str[::2]
- [1, 3, 5, 7]
在这里再多补充一点, step 也是可以等于负数的, str[::-1] 表示的是从列表的右边看这个列表, 然后按照 step = 1 去列表中的元素, 当然 step 还可以等于 -2,-3, 具体是多少看到时候看心情.
- >>> str = [1,2,3,4,5,6,7,8]
- >>> str[::-1]
- [8, 7, 6, 5, 4, 3, 2, 1]
- >>> str[::-2]
- [8, 6, 4, 2]
列表操作
列表是序列, 但凡是序列都有基本的几种操作, 比如在字符串的时候我们就讲过它的几种操作, 列表的基本操作和字符串的差不多, 在这基础上, 列表还有其独特的操作, 对于基本操作, 比如连接操作等我在这里就不讲了, 忘记的可以求看前面的文章, 我在这里只是说一下列表独特的操作.
列表与字符串一个很大的不同是, 字符串不可修改, 但是列表可以修改.
- >>> str = ['python','c++','java']
- >>> str[0] = 'c#'
- >>> str
- ['c#', 'c++', 'java']
- >>> name = 'rocky'
- >>> name[0] = 'R'
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- TypeError: 'str' object does not support item assignment
其次, 除了可以修改元素以外, 列表还可以继续给自己添加元素, 但是不是说列表随便可以给自己加戏, 必须要用 append() 方法向列表中追加元素, 追加到末尾.
- >>> str = ['python','c++','java']
- >>> str[3] = 'c#'
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- IndexError: list assignment index out of range
- >>> str.append('c#')
- >>> str
- ['python', 'c++', 'java', 'c#']
常用列表函数
作为 Python 中出了名的苦哈哈, 它必然有很多的函数去实现功能, 感兴趣的朋友们可以用 dir(list) 查看, 我在这里主要说一下那些经常用到的.
1.append: 这个其实我们在昨天的文章 ( 零基础学习 Python 之列表 ( 一 ) )中说过, 它执行的结果就是将某个元素加入到一个一直列表的最右边.
- >>> str = [1,2,3,4,5]
- >>> str.append(6)
- >>> str
- [1, 2, 3, 4, 5, 6]
2.extend: 官方的说法是从可迭代的对象那里获取元素, 将它们追加到已知的列表中, 从而达到扩充的目的, 其实就是能够将两个列表合并.
- >>> str = [1,2,3,4,5]
- >>> str1 = ['abc','def']
- >>> str.extend(str1)
- >>> str
- [1, 2, 3, 4, 5, 'abc', 'def']
3.count: 这是一个可以帮我们搞清楚列表中的元素重复出现次数的方法.
- >>> a = [1,2,3,4,5,1,2,3]
- >>> a.count(1)
- 2
- >>> a.append('a')
- >>> a.append('a')
- >>> a
- [1, 2, 3, 4, 5, 1, 2, 3, 'a', 'a']
- >>> a.count('a')
- 2
- >>> a.count('b')
- 0
4.index: 该函数能够查到你想查的函数在列表中第一次出现的位置, 比起之前的文章我们说的索引, 这个才是真真正正的索引.
- >>> a = [1,2,3,4,'abc','def']
- >>> a.index(2)
- 1
5.insert: 这个厉害了, 之前在 1 和 2 中我们说的 append 和 extend 只是能在列表的最右添加元素, 而 insert 可以在列表的任意位置增加一个元素.
- >>> a = [1,2,3,4,'abc','def']
- >>> a.insert(0,'rocky')
- >>> a
- ['rocky', 1, 2, 3, 4, 'abc', 'def']
6.remove & pop: 列表中的元素不光能够增加元素, 还可以删除元素, remove() 和 pop() 就是列表用来删除元素的函数. romove() 函数删除元素首先这个元素必须要存在, 其次它是在原列表上进行删除, 当列表中有重复元素的时候, 只删除第 1 个.
- >>> a = [1,2,3,4,1]
- >>> a.remove(1)
- >>> a
- [2, 3, 4, 1]
- >>> a.remove('a')
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- ValueError: list.remove(x): x not in list
pop() 函数如果填写删除元素的索引的话, 那么就是删除该元素, 如果没有制定删除元素的索引, 则删除列表的最后一个元素, 并且 pop() 函数有返回值, 返回的就是删除的那个元素.
- >>> a = [1,2,3,4,1]
- >>> a.pop(1)
- 2
- >>> a.pop()
- 1
- >>> a
- [1, 3, 4]
7.reverse: 这个函数很简单, 就是直接把列表的元素顺序反过来.
- >>> a = [1,2,3,4,1]
- >>> a.reverse()
- >>> a
- [1, 4, 3, 2, 1]
8.sort: 这个函数是对列表进行排序, 默认是递增排序, 通过改变默认参数 reverse 的值可以实现递减排序.
- >>> a = ['c','d','a','k']
- >>> a.sort()
- >>> a
- ['a', 'c', 'd', 'k']
- >>> a.sort(reverse = True)
- >>> a
- ['k', 'd', 'c', 'a']
比较列表 & 字符串
列表和字符串这两种对象类型有很多相似的地方, 也有很大的区别, 在这里简单比较一下, 也算是对前面所学的一个复习.
相同点:
1. 两者都是序列类型, 都可以从左向右 (从左向右), 依次用 0,1,2...(-1,-2,-3...) 表示, 通过这样的方式建立索引, 同样可以用切片的方法得到 一个或多个元素.
2. 对于序列的基本操作来说, 二者都适用, 比如连接操作等, 还有像 len() 这一类的函数也都是适用的.
不同点:
1. 字符串和列表的最大区别就是: 列表的可变的, 但是字符串是不可变的. 我们在上面讲到的列表函数, 诸如 append(),insert(),pop() 等对字符串来说都是不适用的.
2. 元素的包裹性, 这是我自己想的一个词, 可能不太贴切. 字符串里的每个元素都只是字符, 而列表里的元素可以是其它任何的诸如数字, 字符串, 列表等对象类型.
到这里, 列表差不多就写完了, 列表虽然是苦哈哈, 但先让它做这些事情把, 显得我们比较仁义点..
来源: https://juejin.im/post/5c06413c5188251a8266290d