Python 列表

列表

​ Python中的列表,类型是list。

​ 由于Python是动态语言,所以list中可存储任意类型的数据,这与静态语言有很大的区别。

基本声明

​ 以下是使用类的形式进行声明:

li = list((1, 2, 3, 4, 5))
print("值:%s,类型%s" % (li, type(li)))
# 值:[1, 2, 3, 4, 5],类型<class 'list'>

​ 也可以选择使用更方便的字面量形式,使用[]对元素进行包裹:

li = [1, 2, 3, 4, 5]
print("值:%s,类型%s" % (li, type(li)))
# 值:[1, 2, 3, 4, 5],类型<class 'list'>

多维列表

​ 当一个列表中嵌套另一个列表,该列表就可以称为多维列表。

​ 如下,定义一个二维列表:

li = [1,2,["三","四"]]
print("值:%s,类型:%s"%(li,type(li)))
# 值:[1, 2, ['三', '四']],类型:<class 'list'>

类型转换

​ 列表支持与bool和str以及set进行转换:

li = [1,2,3]
b_list = bool(li)  # 布尔类型
s_list = str(li)  # 字符串类型
set_list = set(li)  # 集合类型

print("值:%s,类型:%s"%(b_list,type(b_list)))
print("值:%s,类型:%s"%(s_list,type(s_list)))
print("值:%s,类型:%s"%(set_list,type(set_list)))

# 值:True,类型:<class 'bool'>
# 值:[1, 2, 3],类型:<class 'str'>
# 值:{1, 2, 3},类型:<class 'set'>

​ 如果多维列表遵循一定的规律,那么也可以将其转换为dict:

li = [["k1","v1"],["k2","v2"],["k3","v3"]]
d_list = dict(li)
print("值:%s,类型:%s"%(d_list,type(d_list)))
# 值:{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'},类型:<class 'dict'>

四则运算

​ 列表支持与元组,列表相加,做到合并的效果,类似于extend()方法:

l1 = [1, 2, 3]
l2 = [4, 5, 6]
result = l1 + l2
print(result)
# [1, 2, 3, 4, 5, 6]

​ 列表支持与数字进行*运算,这会重复向被乘的列表中添加元素:

l1 = [1, 2, 3]
result = l1 * 3
print(result)

​ 除此之外的运算符均不支持(一些增量运算符是允许的,如*=,+=,但是这样的使用场景非常少,故不举例):

l1 = [1, 2, 3]
l2 = [4, 5, 6]
result = l1 - l2
print(result)
# TypeError: unsupported operand type(s) for -: 'list' and 'list'

其他特性

​ 列表是属于引用类型,即当传递时不会进行复制,而是进行引用传递。

​ 列表属于可变容器类型,不同于str的原子容器类型,list允许使用index进行改值操作。

li = [1, 2, 3]
print(id(li))  # 12379848
li[1] = "二"
print(id(li))  # 12379848

索引切片

​ 列表的索引切片与字符串相同,可参见文章:https://www.cnblogs.com/YunyaSir/articles/13832635.html

基本使用

​ 使用索引可对列表中的元素进行删,改,查:

li = ["A", "B", "C", "D"]

# 删
del li[0]
print(li)
# ['B', 'C', 'D']

# 改
li[-1] = "d"
print(li)
# ['B', 'C', 'd']

# 查
result = li[2]
print(result)
# d

​ 试图访问一个超出索引之外的元素,将抛出异常:

li = ["A", "B", "C", "D"]

print(li[100])
# IndexError: list index out of range

​ 也可以从列表中进行截取操作,如使用[:]将当前列表进行复制,需要注意的是它将重新开辟一个内存空间,类似于浅拷贝,这与str不同,str不会进行拷贝而是进行引用:

li = ["A", "B", "C", "D"]
print("值:%s,地址编号:%d"%(li,id(li)))
copy_li = li[:]
print("值:%s,地址编号:%d"%(copy_li,id(copy_li)))

# 值:['A', 'B', 'C', 'D'],地址编号:12904136
# 值:['A', 'B', 'C', 'D'],地址编号:12906344

多维取值

​ 使用多重索引来对多维列表进行取值,如下示例,在三维列表中取出元素9:

li = [1, 2, 3, [4, 5, 6, [7, 8, 9]]]
result = li[3][3][-1]
print(result)
# 9

解构方法

*语法

​ 使用*语法可对列表进行解构,将列表中的元素全部提取出来:

li = [1, 2, 3]
print(*li)
# 1 2 3

​ 我们可以利用*语法的特性,来达到两个列表进行合并的效果:

l1 = [1, 2, 3]
l2 = [4, 5, 6]
result = [*l1, *l2]
print(result)
# [1, 2, 3, 4, 5, 6]

解构赋值

​ 如果一个列表中的元素需要赋值到变量中,可使用解构赋值,需要注意的是变量接收位置与列表中的元素位置一一对应:

li = ["云崖", 19]
name, age = li
print(name, age)
# 云崖 19

常用方法

获取长度

​ 使用len()来进行长度的获取。

​ 返回int类型的值。

li = ["A", "B", "C", "D"]
print(
    len(li) # 4
    )

追加元素

​ 使用append(ele)来对当前列表新增一个子元素。

​ 返回None。

li = ["A", "B", "C", "D"]
li.append("E")
print(li)  # ['A', 'B', 'C', 'D', 'E']

列表合并

​ 使用extend(iter)来让当前列表与另一个可迭代对象进行合并。

​ 返回None。

l1 = [1, 2, 3]
l2 = [3, 4, 5]
l1.extend(l2)
print(l1)
# [1, 2, 3, 3, 4, 5]

插入元素

​ 使用insert(int,ele)将特定元素插入当前列表中的指定位置。

​ 返回None。

l1 = [1, 2, 3]
l1.insert(1, "二")
print(l1)
# [1, '二', 2, 3]

列表拷贝

​ 使用copy(li)将当前列表进行浅拷贝。

​ 返回当前列表的拷贝对象。

l1 = [1, 2, 3]
result = l1.copy()
print(result)
# [1, 2, 3]

弹出元素

​ 使用pop(int)弹出当前列表中在此索引的元素。

​ 返回被弹出的元素。

l1 = [1, 2, 3]
result = l1.pop(2)  # 如不指定改参数,默认弹出 -1
print(result)
# 2

删除元素

​ 使用remove(eleName)删除当前列表中的元素,按照元素名进行删除。

​ 如果有多个同名的元素,则只会删除第一个。

​ 返回None。

li = ["first","last","first","last"]
li.remove("first")
print(li)
# ['last', 'first', 'last']

清空元素

​ 使用clear()将当前列表中进行清空,即删除所有元素。

​ 返回None。

li = ["A", "B", "C"]
li.clear()
print(li)
# []

统计次数

​ 使用count(eleName)统计元素在该列表中出现的次数。

​ 返回int。

li = ["A", "B", "C"]
result = li.count("A")
print(result)
# 1

查找位置

​ 使用index(eleName)找到元素在当前列表中所在的索引值,如元素不存在则抛出异常。

​ 返回int。

li = ["A", "B", "C"]
result = li.index("A")
print(result)
# 0

顺序排列

​ 使用sort(li)将当前列表中的元素按照ASCII码顺序进行排列,默认从小到大。

​ 可指定参数resverse,用于是否翻转列表,如翻转列表则代表从大到小。

​ 返回None。

注意:由于强类型编程语言的原因,不支持int与str的对比

li = ["A", "a", "c","d","B"]
li.sort(reverse=True)  # 从大到小
print(li)
# ['d', 'c', 'a', 'B', 'A']

翻转列表

​ 使用reservse(li)将当前列表进行翻转。

​ 返回None。

li = ["A", "B", "C"]
li.reverse()
print(li)
# ['C', 'B', 'A']

底层存储

​ 原子容器类型str与可变容器类型list有什么差异?同属于容器类型为什么str不允许修改而list允许修改呢?

​ 这是因为底层存储方式的不同,str是占用一整块连续内存,而list是引用一块内存后做顺序存储故可进行修改。

​ 如下图所示:

img

>>> li = ["a","b","c"]
>>> id(li)
2210045360960   # 变量名li 绑定的内存地址
>>> id(li[0])
2210044891248
>>> li[0] = "A"
>>> id(li)
2210045360960   # 可以看到其中元素已经改变了,但是其li 绑定的内存地址依旧没有任何改变
>>> id(li[0])
2210045361456   # li中0号元素内存地址发生了变化
>>>
posted @ 2020-10-18 15:29  云崖君  阅读(158)  评论(0)    收藏  举报