Python基础【第六篇】:基础数据类型(列表)
列表(List)
序列
“序列”是程序设计中经常用到的数据存储方式。在其他程序设计语言中,“序列”通常被称为”数组“,用于存储相关数据项的数据结构。几乎每一种程序设计语言都提供了“序列”数据结构,如C和Basic中的一维、多维数组等。
所有序列都可以进行某些特定的操作,这些操作包括,索引,分片,加,乘以及检查某个元素是否属于序列的成员。除此之外,Python还有计算序列长度,找出最大元素和最小元素的内建函数。
python提供的序列类型在所有程序设计语言中是最丰富、最灵活,也是功能最强大的。python中支持3种常用基本序列数据类型:字符串、列表和元祖,还支持1种映射数据类型:字典。
创建一个列表,只需要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:
list1 = ['baidu','tencent','alibaba'] list2 = [1,2,4,5] list3 = ["a","b",1,2,3]
与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等。
访问列表中的元素(与字符串无异)
list1 = ['baidu','tencent','alibaba'] list2 = ["a","b",1,2,3] print('list1[0]:',list1[0]) print('list1[0:2]:',list1[0:2]) print('list2[1:]:',list2[1:])
list1[0]: baidu list1[0:2]: ['baidu', 'tencent'] list2[1:]: ['b', 1, 2, 3]
与字符串和数字不同的是列表中的元素是可以被改变的。
list = [0,1,2,'baidu','tencent'] print("list[3]:",list[3]) list[3] = 'alibaba' print("list[3]:",list[3]) str = 'alibaba' str[1] = 'a'
list[3]: baidu list[3]: alibaba Traceback (most recent call last): File "C:/Users/dell/PycharmProjects/Python_1/day10/firstPy.py", line 6, in <module> str[1] = 'a' TypeError: 'str' object does not support item assignment
可以删除列表中的元素,即将其设为空列表。
list = [0,1,2,'baidu','tencent'] print("list:",list) list[3:] = [] print("list:",list)
list: [0, 1, 2, 'baidu', 'tencent'] list: [0, 1, 2]
可以使用 del 语句来删除列表的元素。
list = [0,1,2,'baidu','tencent'] print("list:",list) del list[:3] print("list:",list)
list: [0, 1, 2, 'baidu', 'tencent'] list: ['baidu', 'tencent']
下文会介绍python的内建函数remove()。
python列表脚本操作符
列表对 + 与 * 的操作符与字符串是相通的,一个是连接,一个是重复。
list1 = [0,1,2] list2 = ['baidu','tencent'] print("list1 + list2:",list1 + list2) print("list2 * 3:",list2 * 3)
list1 + list2: [0, 1, 2, 'baidu', 'tencent'] list2 * 3: ['baidu', 'tencent', 'baidu', 'tencent', 'baidu', 'tencent']
列表里的列表
列表中可以再嵌套列表,即将列表视为一个列表的元素,有着二维的概念。
list1 = [0,1,2,3] list2 = ['baidu','tencent','alibaba'] list = [list1,list2] print("list:",list) print("list[1][2]:",list[1][2]) print("list[0][1:]",list[0][1:])
list: [[0, 1, 2, 3, 'affafa'], ['baidu', 'tencent', 'alibaba']] list[1][2]: alibaba list[0][4][3] a
字符串也可以看做是一维序列,所以当列表中有字符串,就可以用二维访问的方法取到字符串里的字符。
list1 = [0,1,2,3] list2 = ['baidu','tencent','alibaba'] list = [list1,list2] print("list[1][1][1:]",list[1][1][1:]) print('list2[0][:-2]:',list2[0][:-2])
list[1][1][1:] encent
list2[0][:-2]: bai
python中关于list的方法及函数
方法 | 描述 |
---|---|
len(list) | 列表元素个数 |
max(list) | 返回列表元素最大值 |
min(list) | 返回列表元素最小值 |
list(seq) | 将元组转换为列表 |
list.append(obj) | 在列表末尾添加新的对象 |
list.count(obj) | 统计某个元素在列表中出现的次数 |
list.extend(seq) | 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) |
list.index(seq) | 从列表中找出某个值第一个匹配项的索引位置 |
list.insert(index,obj) | 将对象插入列表 |
list.pop([index=-1]) | 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
list.remove(obj) | 移除列表中某个值的第一个匹配项 |
list.reverse() | 反向列表中元素 |
list.sort(cmp=None,key=None,reverse=False) | 对原列表进行排序 |
list.clear() | 清空列表 |
list.copy() | 复制列表 |
方法实例代码
- 方法len()的代码
list = [1,23,['james',1],'kobe'] print("len(list):",len(list))
len(list): 4
- 方法min(),max()的代码
list = [1,2,6] print("max(list):",max(list)) print("min(list):",min(list)) #必须是一维列表,元素必须都是数字
max(list): 6 min(list): 1
- 方法list(seq)的代码
tuple = (123,34,'八嘎呀路','死啦死啦地') str = '小日本鬼子' print('type(tuple):',type(tuple)) print('type(str):',type(str)) list1 = list(tuple) list2 = list(str) print('list1:',list1) print('type(list1):',type(list1)) print('list2:',list2) print('type(list2):',type(list2))
type(tuple): <class 'tuple'> type(str): <class 'str'> list1: [123, 34, '八嘎呀路', '死啦死啦地'] type(list1): <class 'list'> list2: ['小', '日', '本', '鬼', '子'] type(list2): <class 'list'>
元组与列表的区别就在于,元组的值不可以改变,列表则可以改变。
- 方法list.append(obj)的代码
list = [123,34,'八嘎呀路','死啦死啦地'] list.append('小日本') print("更新:",list)
#该方法无返回值,但是会修改原来的列表。更新: [123, 34, '八嘎呀路', '死啦死啦地', '小日本']
- 方法list.count(obj)的代码
list = ['a','abc','c','abc','abc','a'] print("元素’a‘在list中出现了{0}次".format(list.count('a'))) print("元素’abc‘在list中出现了{0}次".format(list.count('abc')))
元素’a‘在list中出现了2次 元素’abc‘在list中出现了3次
- 方法list.extend(seq)的代码#该方法没有返回值,但会在已存在的列表中添加新的列表内容。
'''extend()与append()的区别在于,append()传入的是一个对象,
而extend()传入的只能是列表,且将列表中的元素加到调用此方法的
列表中''' list1 = ['tencent','taobao','alibaba'] list2 = [1,2,3] list1.append(list2) print('list1',list1) list3 = ['tencent','taobao','alibaba'] list4 = [1,2,3] list3.extend(list4) print("list3:",list3)list1 ['tencent', 'taobao', 'alibaba', [1, 2, 3]] list3: ['tencent', 'taobao', 'alibaba', 1, 2, 3]
- 方法list.index(obj)的代码
list = ['alibaba','taobao','tencent','baidu','taobao'] print("对象'baidu'在list中的索引值为:",list.index('baidu')) print("对象'taobao'在list中的索引值为:",list.index('taobao')) #将会返回第一个匹配项的索引,如果没有找到则会报出异常
对象'baidu'在list中的索引值为: 3 对象'taobao'在list中的索引值为: 1
- 方法list.insert(index,obj)的代码
'''index为插入的指定位置,obj为插入的对象。两个参数必须都要有。 此方法无返回值,作用到原列表上''' list = ['alibaba','tencent','baidu','taobao'] list1 = [1,2,3] list.insert(2,list1) print('插入元素list1到list的索引2后:',list) list.insert(0,'wechat') print('插入元素’wechat‘到list的索引0后',list)
插入元素list1到list的索引2后: ['alibaba', 'tencent', [1, 2, 3],
'baidu', 'taobao'] 插入元素’wechat‘到list的索引0后 ['wechat', 'alibaba',
'tencent', [1, 2, 3], 'baidu', 'taobao'] - 方法list.pop([index=-1])的代码
'''pop() 函数用于移除列表中的一个元素(默认最后一个元素), 并且返回该元素的值。参数index为可选参数,默认移除最后一个元素。''' list = ['alibaba','tencent','baidu','taobao'] print('我想要移除索引为2的元素:',list.pop(2)) print('移除之后的列表:',list)
我想要移除索引为2的元素: baidu 移除之后的列表: ['alibaba', 'tencent', 'taobao']
- 方法list.remove(obj)的代码
'''remove()方法用于移除列表中某个值的第一个匹配项。 该方法无返回值。参数obj为必须参数。''' list = ['alibaba','tencent','baidu','taobao','tencent'] list.remove('tencent') print('移除元素‘tencent’后:',list)
移除元素‘tencent’后: ['alibaba', 'baidu', 'taobao', 'tencent']
- 方法list.reverse()的代码
'''reverse()方法会对列表的元素方向排序,且没有返回值''' list = ['alibaba','tencent','baidu','taobao'] print("原来的排序:",list) list.reverse() print('反向的排序:',list)
原来的排序: ['alibaba', 'tencent', 'baidu', 'taobao'] 反向的排序: ['taobao', 'baidu', 'tencent', 'alibaba']
- 方法list.sort(cmp=None,key=None,reverse=False)的代码
list1 = [1,4,3,2,7] list2 = ['baidu','alibaba','tencent','jingdong'] list1.sort() list2.sort() print('默认排序:',list1) print('默认排序:',list2) #默认升序 list1.sort(reverse=True) list2.sort(reverse=True) print("降序排序:",list1) print("降序排序:",list2) #降序排序 #数字类型和字符类型不能相互比较,且字符按照首字符排序
降序排序: [7, 4, 3, 2, 1] 降序排序: ['tencent', 'jingdong', 'baidu', 'alibaba']
通过指定列表中的元素的某些特性来排序
#通过指定列表中的元素的某些特性来进行排序 def takeSecond(elem): return elem[1] #此方法为获取一个序列的第二个元素。 def str_len(elem): return len(elem) #此方法为获取一个序列的长度。 list = [(1,8),(2,3,5),(5,1),(8,3,3),(5,6,7)] #列表中的元素都是元组 list1 = ['aliabab','tencent','baidu','taobao'] #列表中元素都是字符串 list.sort(key=takeSecond) print("按照元组的第二个元素升序排序:",list) list1.sort(key=str_len,reverse=True) print("按照字符串的长度降序排序",list1)
按照元组的第二个元素升序排序: [(5, 1), (2, 3, 5), (8, 3, 3), (5, 6, 7),
(1, 8)] 按照字符串的长度降序排序 ['aliabab', 'tencent', 'taobao',
'baidu']key接受的是一个只有一个形参的参数,如代码中的takeSecond(elem),str_len(elem)。key接受的是函数返回值,作用于列表的每个元素,表示此元素的权值,按照权值排序。
- 方法list.clear()的代码
'''clear() 函数用于清空列表,类似于 del a[:]。无返回值''' list = ['alibaba','tencent','baidu','taobao'] list.clear() print('清空元素后:',list)
#返回空列表[]空列表可以简单地通过两个中括号进行表示([])- 一里面什么东西都没有,但是,如果想创建一个占用十个元素空间,却不包括任何有用内容的列表,又该怎么办呢?
>>> list = [None]*10 >>> list [None, None, None, None, None, None, None, None, None, None]
None 是一个Python的内建值,它的确切含意是"这里什么也没有"。
- 方法list.copy()的代码
'''copy() 函数用于复制列表,类似于 a[:],返回复制后的新列表。''' list = ['alibaba','tencent','baidu','taobao'] list_copy = list.copy() print("复制的列表:",list_copy)
复制的列表: ['alibaba', 'tencent', 'baidu', 'taobao']
Python中的复制会有两种情况,一种是改变内存一种是不改变内存。
list1 = [1,2,3] list2 = list1 #直接赋值 list3 = [] #间接赋值 list3 = list1 list4 = list1[:] list_copy = list1.copy()
print("原来的列表:","list1:{0},list2:{1},list3:{2},
list4:{3},list_copy:{4}" .format(list1,list2,list3,list4,list_copy)) #五个列表的值都是一样的。 #当我们改变原始列表list1的值时。 list1.extend([4,5,6]) print("改变原始列表之后:","list1:{0},list2:{1},list3:{2},list4:{3},list_copy:{4}" .format(list1,list2,list3,list4,list_copy))
#五个列表的内存地址 print('五个列表的地址:',"list1:{0},list2:{1},list3:{2},list4:{3},list_copy:{4}" .format(id(list1),id(list2),id(list3),id(list4),id(list_copy))) '''前三种复制方法只是复制了一个引用变量而已,变量真正指向的内存并没有被复制, 后两种方法是真正的拷贝了变量指向的内容放到了另一块内存当中,是真正的拷贝。'''