python数据结构之列表(list)——超详细

列表

1.创建方式

[] 或 list()

a = [] # 表示一个空列表
a = [1, 2, 3, 4, 5]
a

   [1, 2, 3, 4, 5]

list("hello world")

   ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

l = list("hello world")#l列表长度为11, 小标从0到10
l[1]

   'e'

l[10]

   'd'

l[-1] # 逆序取值  在数值前面加上负号,表示逆序取值

   'd'

2.列表的切片功能

l[0:5]  # 表示下标从0开始遍历到4, 左闭右开

   ['h', 'e', 'l', 'l', 'o']

l[开始:结尾:步长] # 步长可以省略,默认值为1

l[:5]#表示从最开始切片到4

   ['h', 'e', 'l', 'l', 'o']

l[5:] # 表示从5开始切片到最后

   [' ', 'w', 'o', 'r', 'l', 'd']

l[:]  #表示遍历所有

   ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

l[::2] # 步长为2,遍历

   ['h', 'l', 'o', 'w', 'r', 'd']

l[::-1] #步长为-1, 表示倒序遍历,实现列表的翻转

   ['d', 'l', 'r', 'o', 'w', ' ', 'o', 'l', 'l', 'e', 'h']

3.向列表中添加元素

# attend 表示在列表最后添加一个元素
number = [1, 2, 3, 4, 5]
number.append(6)
number

   [1, 2, 3, 4, 5, 6]

# 使用extend()向列表末尾添加多个元素
number = [1, 2, 3, 4, 5, 6]
number.extend([7, 8])
number

   [1, 2, 3, 4, 5, 6, 7, 8]

# 在列表的任意位置插入元素
number.insert(0, 0)  #第一个参数表示列表中的位置,第二个参数表示要插入的值
number

   [0, 0, 1, 2, 3, 4, 5, 6, 7, 8]

4.从列表中获取元素

# 交换位置
name = ["鸡蛋", "鸭蛋", "鹅蛋", "鸟蛋"]
name[0], name[3] = name[3], name[0]
name

   ['鸟蛋', '鸭蛋', '鹅蛋', '鸡蛋']

name[0]

   '鸟蛋'

列表赋值的骚操作

L1 = [1, 2, 3]
a, b, c = L1
print(a, b, c)

   1 2 3

5.从列表中删除元素

有三种方法:remove()、del、pop()

# .remove(x)函数,并不需要知到x在哪个位置,如果想要删除的东西没在列表中的话,就会报错
# remove()函数不能指定删除某个位置的值
name.remove("鹅蛋")
name

   ['鸟蛋', '鸭蛋', '鸡蛋']

# del函数
del name[0]
name

   ['鸭蛋', '鸡蛋']

# 删除整个列表,在del 后面加上列表名字即可
del name
# 再执行name语句便会报错
# .pop()默认弹出列表中最后一个数
name = ["鸡蛋", "鸭蛋", "鹅蛋", "鸟蛋"]
name.pop()

   '鸟蛋'

# 也可以在pop()中加入索引值
name = ["鸡蛋", "鸭蛋", "鹅蛋", "鸟蛋"]
name.pop(2)

   '鹅蛋'

name

   ['鸡蛋', '鸭蛋', '鸟蛋']

6.列表比较

# list比较大小是从第一个元素开始,一个一个进行比较,只要有了结果就会马上返回值
list1 = [123]
list2 = [456]
list1 > list2

   False

list1 = [123, 789]
list2 = [456, 321]
list1 > list2

   False

7.列表的 * + 运算

# 在列表中,我们可以通过+号,实现俩个列表的拼接
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = list1 + list2
list3

   [1, 2, 3, 4, 5, 6]

#也可以使用extend()函数实现列表的拼接
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
list1

   [1, 2, 3, 4, 5, 6]

# *(乘号)表示重复操作符,能使列表复制
list1 = [1, 2, 3]
list1 *= 3
list1

   [1, 2, 3, 1, 2, 3, 1, 2, 3]

8.二维列表

# 如何访问二维列表中的数字
list1 = [1, 2, [3, 4, 5],6]
list1[2] # 也表示一个列表

   [3, 4, 5]

# 因为list1[2]可以看做是一个列表,所以我们可以通过对list1[2]的下标进行访问
list1[2][0]

   3

list1[2][1]

   4

8.列表中的in 和 not in

list1 = [1, 2, 3, 4]
1 in list1

   True

5 in list1

   False

5 not in list1

   True

# 对于二维数组,in 和 not in 只能判断一个层次的成员关系,如果想要判断二维数组中的元素
#是否存在,需要进入下一层次中进行访问
list1 = [1, 2, [3, 4], 5]
3 in list1

   False

3 in list1[2]

   True

9.列表中的几个函数

dir(list) # 查看列表有多少该可以使用的函数
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__iadd__',
 '__imul__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__reversed__',
 '__rmul__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort']
# len()函数用来返回列表的长度
list1 = [1, 2, 3, 4, 5]
len(list1)
5
# count()用来计算一个数在列表中出现的次数
list1 = [1, 2, 1, 2, 1, 3, 4]
list1.count(1)

   3

# index()函数会返回一个数在列表中的位置
list1.index(4)

   6

list1.index(1)# 这里返回的是第一个1出现的位置

   0

# 我们可以通过限制范围来查找下一个值
start = list1.index(1) + 1
end = len(list1)
list1.index(1, start, end)

   2

# reserve()方法的作用是将整个列表翻转
list1 = [1, 2, 3, 4, 5, 6]
list1.reverse()
list1

   [6, 5, 4, 3, 2, 1]

# sort() 对列表中的元素进行从小到大排序
list1.sort()
list1

   [1, 2, 3, 4, 5, 6]

深拷贝与浅拷贝

a =  [1, 2, 3]
b = a
a[0] = 5
a

   [5, 2, 3]

b

   [5, 2, 3]

我们发现当我们改变a的值时,b也会跟着改变,原因是,a与b指向了同一个内存单元,
当内存单元中的值发生改变时,所有指向这个内存单元的变量也会跟着改变

a = [1, 2, 3]
b = a[:]
a[0] = 5
a

   [5, 2, 3]

b

   [1, 2, 3]

当a将自己切片所获得的值给b时,由于b并没有和a指向同一片内存单元,只是a将自己内存单元的东西
复制给了b所在的内存单元,所以对a内存单元的值进行改变时,并不会改变b中值

# 浅拷贝(copy()),b不会应为a的改变而改变
a = [1, 2, 3]
b = a.copy()
c = list(a)# c 和 d得到的都是a的返回值,并没有指向a所在的地址,所以都属于浅拷贝
d = a[:]
a[0] = 5
a

   [5, 2, 3]

b

   [1, 2, 3]

c

   [1, 2, 3]

d

   [1, 2, 3]

a = [1, 2, [3, 4], 5]
b = a.copy()
a[1] = 6
a[2][0] = 7
a

   [1, 6, [7, 4], 5]

b

   [1, 2, [7, 4], 5]

我们发现通过改变a的值,b中一维数组中的数并没有发生改变,但二维数组中的数发生了改变
因为我们copy的时候,将二维数组的地址也进行了copy所以,a与b的二维数组是指向了同一个内存单元,当我们对a的二维数组中的值进行改变时,b中二维数组中的值也会随之改变

# 深拷贝(deepcopy())  通过深拷贝,对a中二维数组中的值进行改变时,
# b中二维数组中值不会再发生变化
import copy
a = [1, 2, 3, [1, 2, 3]]
b = copy.deepcopy(a)
a[3][0] = 4
a

   [1, 2, 3, [4, 2, 3]]

b

   [1, 2, 3, [1, 2, 3]]

# copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象内部的子对象
import copy
a = [1, 2, 3, [1, 2, 3]]
b = copy.copy(a)
a[3][1] = 0
a[1] = 6
a

   [1, 6, 3, [1, 0, 3]]

b

   [1, 2, 3, [1, 0, 3]]

你可能感兴趣的:(python,python)