Python基础之列表List

Python基础之列表List


数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
在Python中拥有四大数据结构:列表list、集合dict、元组tuple、集合set
本篇主要介绍最常用数据结构List


1.列表定义

列表:本质上是一个大容器,在该容器中存在若干个子容器,每一个容器都可以存储任意类型的数据,列表中元素的访问可以通过list[index]的方式访问,其中index代表子容器的下标,该下标从0开始

names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
# 获取列表数据
print(names[0])
# wxq

2.列表创建

方式1:通过[]快速创建

list1 = [1, 2, 3, 'aa', 'bb']
print(list1)
# [1, 2, 3, 'aa', 'bb']

方式2:通过list()方法创建,开发中经常用来类型转换

list1 = list(range(10))
print(list1)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

方式3:通过表达式创建,语法结构:[数学表达式 条件1 条件2 条件3…]
数学表达式用来产生一个数据
条件1:for循环,用来执行数据的重复生成
其他条件:可以是for循环也可以是if判断

# 取出1-9的偶数并放入列表
list1 = [x for x in range(1, 9) if x & 1 == 0]
print(list1)
# [2, 4, 6, 8]

# 定义一个列表,存储所有的水仙花数
list1 = [i for i in range(100, 1000) if (i // 100) ** 3 + (i % 100 // 10) ** 3 + (i % 10) ** 3 == i]
print(list1)
# [153, 370, 371, 407]

方式4:生成器
语法定义: list1 = (生成规则)
此时list1是一个生成器对象,该生成器可以根据开发者的需要灵活决定数据生成的数量,有效地提高计算机的使用效率
如果需要生成一个数据,此时可以通过next(list1),保证生成器list1推断出该数据。并且注意,每一次使用next调用生成器推断数据时,生成器都会在前一次推断的基础上推断下一个数据,如果推断过程超出生成器负载范围,此时生成器会以异常信息StopIteration方式告知开发者该推断过程已经结束
另外生成器本质上也是可以进行迭代的迭代器,可以通过for-in遍历该迭代器,取出所有的推断数据

# 有四个数字:1234,能组成多少个互不相同且无重复数字的三位数?各是多少?
list1 = (100*x+10*y+z for x in range(1, 5) for y in range(1, 5) if x != y for z in range(1, 5) if z != x and z != y)
for item in list1:
    print(item, end=" ")
# while True:
#     print(next(list1), end=" ")
# 使用while会异常停止,可以根据异常抛出来终止生成器
# 123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432 

3.列表的数据提取

方式1:list[index] 获取单个指定下标列表数据
方式2:list[:] 获取整个列表数据
方式3:list[a:] 获取原列表中下标从a开始到列表结束的所有数据
方式4:list[:a] 获取原列表中下标从0开始到a-1位置所有数据
方式5:list[a:b] 获取原列表中下标从a开始到b-1位置的所有数据
方式6:list[a:b:2] 获取原列表中下标从a开始到b-1位置的数据,每次移动两个位置
列表切片:通过指定切片的范围从原列表中提取一段数据的操作
注意:在切片过程中切片得到一个新列表并返回给外界,原列表不会受到影响

list1 = [x for x in range(11)]
print(list1) # 输出整个列表
print(list1[0]) # 输出第0个数据
print(list1[:]) # 输出整个列表
print(list1[:3]) # 输出第0个到第(3-1)个
print(list1[3:]) # 输出第3个到最后一个
print(list1[1:3]) # 输出第1个到第(3-1)个
print(list1[1:7:2]) # 输出第1个到第6个,每次移动两个位置
print(list1[-5:-2]) # 负数代表从后向前数,但实际情况中列表动态生成,此方法不常用
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 0
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# [0, 1, 2]
# [3, 4, 5, 6, 7, 8, 9, 10]
# [1, 2]
# [1, 3, 5]
# [6, 7, 8]

4.列表的数据增加

(1)向末尾添加数据

list.append(item):将数据item添加到列表item中。注意,本次添加在列表最后进行

names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
names.append('狗剩子')
print(names)
# ['wxq', 'ysp', 'ysb', 'zzb', 'sxl', '狗剩子']

(2)在任意位置插入数据

list.insert(index,obj) :在指定的下标index处将元素obj添加到列表中,该方法可以灵活决定元素添加的位置

names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
names.insert(3, '小菜菜')
print(names)
# ['wxq', 'ysp', 'ysb', '小菜菜', 'zzb', 'sxl']

(3)列表合并

使用+连接需要合并的两个列表,返回新的列表

list1 = [1, 2, 3]
list2 = ['aa', 'nn']
list3 = list1 + list2
print(list3)
# [1, 2, 3, 'aa', 'nn']

(4)列表复制

List*n:将list中每一个元素重复n遍

扫描二维码关注公众号,回复: 2438437 查看本文章
list1 = [1, 2, 3]
list1 = list1 * 3
print(list1)
# [1, 2, 3, 1, 2, 3, 1, 2, 3]

5.列表的数据删除

方式1:list.pop():移除列表元素,并且把该元素返回给外界使用,但是注意,如果pop没有给定下标,此时默认移除列表中最后一个位置元素。如果给定下标,此时移除指定下标位置的元素

list1 = [1, 2, 3, 4, 5]
print(list1) # 初始
print(list1.pop()) # 无下标
print(list1.pop(0)) # 有下标
print(list1) # 删除后
# [1, 2, 3, 4, 5]
# 5
# 1
# [2, 3, 4]

方式2:remove(obj):移除列表中第一个与obj匹配的元素,只移除第一个

list1 = [1, 1, 3, 4, 5]
print(list1)
list1.remove(1)
print(list1)
# [1, 1, 3, 4, 5]
# [1, 3, 4, 5]

方式3:清空列表。使用list.clear()或将list指向空列表如list = []

# list.clear()
list1 = [1, 2, 3, 4, 5]
print(list1)
list1.clear()
print(list1)
# [1, 2, 3, 4, 5]
# []

# list = []
list1 = [1, 2, 3, 4, 5]
print(list1)
list1 = []
print(list1)
# [1, 2, 3, 4, 5]
# []

方式4:删除列表。与清空列表不同,def 列表名 删除列表将把整个列表从内存中删除,再次访问列表会出现异常

list1 = [1, 2, 3, 4, 5]
del list1
print(list1)
# NameError: name 'list1' is not defined

6.列表数据的修改

直接使用list[index] = 需要修改的值修改数据

names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
names[0] = "狗蛋"
print(names)
# ['狗蛋', 'ysp', 'ysb', 'zzb', 'sxl']

7.列表数据的遍历

方式一:通过下标遍历(可写)

names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
num = len(names) # 获取列表长度
print(names)
for i in range(num):
    names[i] = i
print(names)
# ['wxq', 'ysp', 'ysb', 'zzb', 'sxl']
# [0, 1, 2, 3, 4]

方式二:通过迭代直接获取(只读)

names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
for item in names:
    print(item, end=" ")
# xq ysp ysb zzb sxl 

方式三:使用内置函数map()遍历(自动遍历计算)

map(fun,list):map用来完成对列表list的便利操作,每一次遍历都会自动调用fun函数完成对遍历得到的元素的计算,当遍历结束之后会返回一个map对象

# 遍历列表并将每一项进行平方运算
list1 = [x for x in range(10)]
result = map(lambda x: x**2, list1)
print(list(result))
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

方式四:使用内置函数filter()遍历(提取指定数据

filter(fun,list):用来遍历列表list,按照给定的过滤条件,完成对满足条件的数据的过滤操作。

其中fun对应的是回调函数,充当过滤条件,因此fun的返回结果必须是一个True/False的布尔类型结果,如果结果为True此时保留该元素,如果为False则删除对应的元素

# 提取列表中的字符串
list1 = [1, 2, 3, 4, 5, "xiaocaicai", "xiaodaidai"]
result = filter(lambda x: isinstance(x, str), list1)
print(list(result))
# ['xiaocaicai', 'xiaodaidai']

8.列表的其他操作

(1)获取列表长度

长度 = len(list)

names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
num = len(names)
print(num)
# 5

(2)列表排序

list.sort()对指定列表进行排序,默认排序方式为升序排序(从小到大)
reverse:布尔类型,默认为false,如果设置为True,则排序按照降序进行排序

list1 = [2, 2, 1, 5, 3, 10]
list1.sort()
print(list1)
list1.sort(reverse=True)
print(list1)
# [1, 2, 2, 3, 5, 10]
# [10, 5, 3, 2, 2, 1]

注意:list.sort()会在原列表上排序,谨慎使用

(3)列表翻转

list.reverse()直接将列表list中所有内容翻转

list1 = [1, 2, 3]
list1.reverse()
print(list1)
# [3, 2, 1]

(4)统计个数

list.count(obj):统计obj数据在列表中出现的次数

list1 = [1, 2, 1, 1, 1, 1, 1, 1]
print(list1.count(1))
# 7

(5)获取元素位置

list.index(obj)获取指定元素在列表中第一次出现的位置

list1 = [1, 2, 1, 1, 1, 1, 1, 1]
print(list1.index(1))
# 0

(6)判断是否在列表中

判断某元素是否在列表中(in, not in)

list1 = [1, 2, 1, 1, 1, 1, 1, 1]
print(1 in list1)
print(1 not in list1)
# True
# False

注:还有很多方法没有用到不再一一赘述

猜你喜欢

转载自blog.csdn.net/w18211679321/article/details/81210478