Python包含6中内建的序列,即列表、元组、字符串、Unicode字符串、buffer对象和 xrange 对象
。最常见的是列表和元组。
序列通用的操作包括:索引、长度、组合(序列相加)、重复(乘法)、分片、检查成员、遍历、最小值和最大值
。
序列中的每个值都有对应的位置值,称之为索引
,第一个索引是 0,第二个索引是 1,依此类推。
列表是最常用的 Python 数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型。
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示
list1 = ['数据STUDIO', 2020, 'Jim']
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
list4 = ['red', 'green', 'blue', 'yellow', 'white', 'black']
[ ]
括起来>>> s = 'python' # 目前的可迭代对象,我们就学了一个字符串
>>> L = list(s)
>>> L
['p', 'y', 't', 'h', 'o', 'n']
>>> type(L)
list
# len()也可以用来查看列表的元素个数
>>> len(L)
6
>>> L = ['life', 'is', 'short', 'I', 'use', 'python'] #列表中的元素是以逗号分隔
>>> L
['life', 'is', 'short', 'I', 'use', 'python']
>>> type(L)
list
# 列表中的内容可以是任意的数据类型
>>> list1 = [1234, 'Hello' ,3.14 ,True, 'abc']
>>> list1
[1234, 'Hello', 3.14, True, 'abc']
# 多维列表
>>> list2 = [1, '数据STUDIO', ['S', 'T', 'U', 'D', 'I', 'O']] # 二维列表
>>> list2
[1, '数据STUDIO', ['S', 'T', 'U', 'D', 'I', 'O']]
>>> list4 = [1, 2, 3, '数据STUDIO', [1, 2, [1, [1, 2, 3], 3], 4, 5] ] # 四维列表
>>> list4
[1, 2, 3, '数据STUDIO', [1, 2, [1, [1, 2, 3], 3], 4, 5] ]
列表的运算与字符串类似,不同于一般意义上的数字加减乘除。
使得列表中的所有元素存放在一个新的列表当中,生成新的列表,原列表不变。
>>> a = [1, 2, 3]
>>> b = [4, 5, [6, 7, 8]]
>>> a+b
[1, 2, 3, 4, 5, [6, 7, 8]]
>>> a
[1, 2, 3]
与字符串类似,重复列表当中的元素,原列表不变。
>>> a = ['关注', '数据STUDIO']
>>> a*3 # 重要的事情说三遍
['关注', '数据STUDIO', '关注', '数据STUDIO', '关注', '数据STUDIO']
>>> a
['关注', '数据STUDIO']
判断元素是否在列表当中。
>>> studio = ['关注', '在看',
'分享', '数据STUDIO']
>>> '关注' in studio
True # 包含在内返回Ture
>>> '点赞' in studio
False # 没包含在内即返回False
# 记得文末点赞哟
另一个较为特殊的写法两个或以上字符串,用逗号隔开,有in
判断的会返回True
or False
,没有判断的返回本身,且总体存储在元组里。
>>> '点赞', '在看' in studio
('点赞', True)
列表是有序的序列,所以每一个数据都有唯一对应的索引值。第一个元素对应的索引值是0,和字符串是一样的
列表[开始位置: 终止位置: 步长和方向]
>>> lt1 = ['点赞', '在看', '转发', '收藏', '关注', '数据STUDIO']
>>> lt1
['点赞', '在看', '转发', '收藏', '关注', '数据STUDIO']
# 取出 '点赞'
>>> lt1[0]
'点赞'
# 取出 '数据STUDIO'
>>> lt1[-1]
'数据STUDIO'
# 取出 ['点赞', '在看', '转发']
>>> lt1[0:3] # 注意切片时最后一个元素取不到
['点赞', '在看', '转发']
# 取出 ['在看', '收藏', '数据STUDIO']
>>> lt1[1: 6: 2]
['在看', '收藏', '数据STUDIO']
# 翻转列表
>>> lt1[::-1]
['数据STUDIO', '关注', '收藏', '转发', '在看', '点赞']
>>> lt5 = ['关注', '在看', 'Jim', '点赞', ['关注', '在看', ['关注', ['关注', '数据STUDIO', '收藏'], '收藏'], '点赞', '转发'] ]
>>> len(lt5)
>>> lt5[4]
['关注', '在看', ['关注', ['关注', '数据STUDIO', '收藏'], '收藏'], '点赞', '转发']
>>> lt5[4][2]
['关注', ['关注', '数据STUDIO', '收藏'], '收藏']
>>> lt5[4][2][1]
['关注', '数据STUDIO', '收藏']
>>> lt5[4][2][1][1]
'数据STUDIO'
>>> lt5[4][2][1][1][2:]
'STUDIO'
因为列表是可变数据类型,因此对列表元素的修改,是直接修改原列表元素。且内存中存储lt2
值的原始块不变
>>> lt2 = ['关注', ['未点赞', '数据STUDIO', '收藏']]
>>> lt2
['关注', ['未点赞', '数据STUDIO', '收藏']]
>>> id(lt2)
2328977461768
# 将"未点赞"改为"已点赞"
>>> lt2[1][0] = '已点赞'
>>> lt2
['关注', ['已点赞', '数据STUDIO', '收藏']]
>>> id(lt2)
2328977461768
>>> lt3 = ['关注', '在看', ['关注', '数据', '收藏'], '收藏']
>>> lt3[1:4] = ['数据', 'STUDIO']
>>> lt3
['关注', '数据', 'STUDIO']
Python是按引用调用还是按值调用?
只了解它的工作原理:
不可变对象(如字符串、数字和元组等)是按值调用的。请注意下面的例子,当在函数内部修改时,name
的值在函数外部不会发生变化。name
的值已分配给内存中该函数作用域的新块(id改变)
。
>>> name = '数据'
>>> def add_chars(s):
... s += 'STUDIO'
... print(s)
... print(id(s))
>>> add_chars(name)
数据STUDIO
2328969879056
>>> print(name)
>>> print(id(name))
数据
2329036911600
可变对象(如列表等)是通过引用调用的。注意下面的例子中,函数外部定义的列表在函数内部的修改是如何影响到函数外部的。函数中的参数指向内存中存储list1
值的原始块(id未改变)
。
>>> list1 = ['关注','数据STUDIO']
>>> def add_element(seq):
... seq.append( '点赞')
... print(seq)
... print(id(seq))
>>> print(list1)
>>> print(id(list1))
['关注', '数据STUDIO']
2329062571400
>>> add_element(list1)
['关注', '数据STUDIO', '点赞']
2329062571400
>>> print(list1)
>>> print(id(list1))
['关注', '数据STUDIO', '点赞']
2329062571400
方法 | 代码 | 功能 |
---|---|---|
增 | list.append(要增加的元素) | 在列表的末尾增加一个元素 |
增 | list.extend(要添加的列表) | 把列表中的每一个元素追加到另一个列表当中 |
增 | list.insert(索引, 要插入的元素) | 新元素是插入到该索引之前的那个位置 |
原列表.append(要添加的元素)
,在最后添加一个元素
>>> list6 = ['life', 'is', 'short', 'I', 'use', 'python']
>>> list6
['life', 'is', 'short', 'I', 'use', 'python']
#append(),在最后面增加,没有返回新的对象
>>> list6.append('关注')
>>> list6
['life', 'is', 'short', 'I', 'use', 'python', '关注']
#在最后面追加一个列表作为最后一个元素
>>> list6.append(['点赞', '数据STUDIO', '收藏'])
>>> list6
['life', 'is', 'short', 'I', 'use', 'python', '关注', ['点赞', '数据STUDIO', '收藏']]
原列表.extend(要添加的列表)
,a.extend(b)
是把b
每一个元素都添加到a
中
>>> list7 = ['life', 'is', 'short']
>>> list8 = ['I', 'use', 'python' ]
>>> list7.extend(list8) # 注意和append()的区别
['life', 'is', 'short', 'I', 'use', 'python']
insert(索引,要插入的对象)
,insert(索引i,v)
表示,把v
插入到索引i
所对应的元素之前
>>> list1 = ['life', 'is', 'short', 'I', 'use', 'python']
>>> list1.insert(5, '数据STUDIO')
['life', 'is', 'short', 'I', 'use', '数据STUDIO', 'python']
方法 | 代码 | 功能 |
---|---|---|
删 | del list[要删除的索引值] | 按索引值删除列表中元素, 不加索引直接删除列表 |
删 | list.clear() | 清空列表中的所有元素,剩下一个空列表 |
删 | list.pop(要删除元素的索引值) | 不写参数值,一般会删除最后一个元素。该方法会返回这个删除的元素 |
删 | list.remove(要删除的元素) | 按元素删除列表中元素 |
del 列表名[要删除元素的索引值]
, 根据下标进行删除
不加索引直接删除列表
>>> list1 = ['点赞', '关注', '数据STUDIO', '未点赞']
>>> del list1
#直接删除变量,而非空列表
>>> list1
-------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-249-32e3a55f6bef> in <module>
----> 1 list1
NameError: name 'list1' is not defined
按索引值删除列表中元素
>>> list1 = list('数据STUDIO')
>>> list1
['数', '据', 'S', 'T', 'U', 'D', 'I', 'O']
>>> del list1[0:2]
>>> list1
['S', 'T', 'U', 'D', 'I', 'O']
清空列表所有元素。剩下一个空列表
>>> list2 = ['S', 'T', 'U', 'D', 'I', 'O']
>>> list2.clear()
>>> list2
[]
# 注意二者的区别del list2是直接删除这个变量,list2.clear()是直接情况列表
默认删除最后一个,并返回这个被删除的元素。原列表中无此元素。
>>> list3 = ['点赞', '关注', '数据STUDIO', '未点赞']
>>> list4 = list3.pop(1) # 指定删除某索引的元素,并返回这个被删除的元素
>>> list4
'关注'
>>> list3
['点赞', '数据STUDIO', '未点赞']
>>> list3.pop() # 默认删除最后一个元素
'未点赞'
>>> list3
['点赞', '数据STUDIO']
当你不知道要删除元素的索引值的时候,可以通过这个进行删除。
用于移除列表中某个值的第一个匹配项,若列表有多个匹配值,只会删除第一个,要想多次删除,需要用到循环语句。
>>> list5 = ['点赞', '未关注', '数据STUDIO', '关注']
>>> list5.remove("未关注")
>>> list5
['点赞', '数据STUDIO', '关注']
包括元素出现的位置与元素出现的次数
list.index(x[, start[, end]]) 获得某个元素首次出现的索引,结束索引取不到
>>> list1 = ['I', 'L', 'O', 'V', 'E', '数', '据', 'S', 'T', 'U', 'D', 'I', 'O']
# 返回指定元素第一次出现的索引
>>> list1.index("O")
2
# 指定范围内查找
>>> list1.index("I",-4,-1)
11
# 找不到,直接报错
>>> list1.index("O",-4,-1)
--------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-11-bc2459127559> in <module>
----> 1 list1.index("O",-4,-1)
ValueError: 'O' is not in list
列表.count(寻找的对象) 获得某个元素出现次数。
>>> list1 = ['I', 'L', 'O', 'V', 'E', '数', '据', 'S', 'T', 'U', 'D', 'I', 'O']
>>> list1.count("O")
2
list.sort(cmp=None, key=None, reverse=False) 降序和升序排列。
此方法会将列表按特定顺序重新排列括号内的参数可以不写,默认升序排列reverse
的英文意思是翻转,如果填写了reverse=True
就意味着列表会降序排列。
>>> list1 = [1, 9, 7, 6, 5, 8, 6, 8]
>>> list1.sort()
>>>list1 # 默认进行升序
[1, 5, 6, 6, 7, 8, 8, 9]
>>> list1.sort(reverse=True) # reverse=True就是降序
>>> list1
[9, 8, 8, 7, 6, 6, 5, 1]
>>> list2 = ['I', 'L', 'O', 'V', 'E', '数', '据', 'S', 'T', 'U', 'D', 'I', 'O']
>>> list2.sort()
>>> list2
['D', 'E', 'I', 'I', 'L', 'O', 'O', 'S', 'T', 'U', 'V', '据', '数']
# 不同的数据类型之间没有某种维度上的大小比较,至少是同一种数据类型
>>> list3 = [5,2,0, '数', '据', 'S', 'T', 'U', 'D', 'I', 'O']
>>> list3.sort()
------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-14-ce08a1369e13> in <module>
1 list3 = [5,2,0, '数', '据', 'S', 'T', 'U', 'D', 'I', 'O']
----> 2 list3.sort()
TypeError: '<' not supported between instances of 'str' and 'int'
通过指定列表中的元素排序来输出列表:
# 获取列表的第二个元素
def takeSecond(elem):
return elem[1]
# 列表
list4 = [(2, 2), (3, 4), (4, 1), (1, 3)]
# 指定第二个元素排序
list4.sort(key=takeSecond)
# 输出类别
print('排序列表:', list4)
[(4, 1), (2, 2), (1, 3), (3, 4)]
列表.reverse()将list所有元素反转
>>> list4 = ['life', 'is', 'short', 'I', 'use', 'python', 1, 2, 3]
# 不改变原列表
>>> list4[::-1]
[3, 2, 1, 'python', 'use', 'I', 'short', 'is', 'life']
# 直接改变原列表
>>> list4.reverse()
>>> list4
[3, 2, 1, 'python', 'use', 'I', 'short', 'is', 'life']