【python】列表

一、创建列表

1
2
listname = [element1,element2,element3,element4,element...]
number = [1,2,3,4,5,6,7]

列表中的元素类型、个数没有限制,但必须是Python支持的数据类型

  • 创建空列表
1
2
3
number = []
# 或者用list()函数创建空列表
number = list()

有了list函数,我们可以在里面添加range函数

现在使用range函数创建一系列元素

1
number = list(range(1,8))
  • del删除整个列表
1
2
3
numbers = list(range(1,11))
print(numbers)
del numbers

二、访问列表

和C语言数组一样

1
num = number[0]

切片操作

1
2
3
4
5
6
numbers = list(range(1,11))
print(numbers[1:5])
print(numbers[1:11:2])
#输出:
#[2, 3, 4, 5]
#[2, 4, 6, 8, 10]

三、遍历列表

1
2
3
4
5
listname=['monday','tuesday','wednesday','thursday','friday']
for item in listname:
print(item)
#variable是可定义的变量
#可以把listname中所有的值输出一遍
  • enumerate函数

如果想给列表中的每一个值配一个下标,可以使用enumerate函数,对listname使用enumerate函数,给listname的每一个值贴一个标签-下标。

注意:此时enumerate函数生成的不是一个列表,返回的是一个惰性迭代器

所谓“惰性”,就是python为了省内存,避免处理大量数据的时候内存溢出。

在这里,numerate函数是一个迭代器,不会一次性生成所有索引—值对,而是在遍历时按需生成。它只是创建了一个状态机,记录了:

  1. 当前指向的索引(默认从 0 开始)。

  2. 当前操作的序列(函数里面的列表)。

它不会在内存中立刻计算放入所有元组,只有当你真正去“要”数据时(比如通过 for 循环或 next()),它才会现场计算并返回一个元组。它每次只在内存里放 1 行 数据,处理完第 1 行,它就把它从内存里“丢掉”,再计算处理第2行,以此迭代下去。它能让你用极小的内存处理无限大的数据。

我们来看看下面这个代码:

1
2
3
4
5
6
7
data = enumerate(['a', 'b'])

# 第一次转换/遍历:
print(list(data)) # 输出: [(0, 'a'), (1, 'b')]

# 第二次转换/遍历:
print(list(data)) # 输出: [] <-- 发现了吗?它变空了!

numerate函数处理这个列表,负责每个元素贴上一个“索引标签”,会返回一个迭代器。后面赋值给data后,data就变成了一个迭代器变量,跑遍了列表后就用完了。

这里的list函数,负责接收返回值,data就像传送带一样,在第一遍list函数的作用下,传送带上的(下标-元素)一个个被扔进print函数里打印出来,传送带上就没货了。第二遍自然就打印不出来了。

这也反映了迭代器的性质,一遍遍地往后计算,却不能回头。

  • 现在展示在for循环中使用
1
2
3
4
listname = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']

for index, day in enumerate(listname):
print(f"第 {index} 个元素是: {day}")

enumerate 每次循环都会吐出一个像 (0, 'monday') 这样的元组。for index, day 会自动把 0 赋值给 index,把 'monday' 赋值给 day

  • 在这里,为什么不用list()函数?

    • 性能优越for 循环是一个“精明”的消费者。它每循环一次,才管 enumerate 要一个值。

    • 内存极省:如果你的列表有一百万行,for 循环配合 enumerate 依然只占用几字节的内存。如果你加了 list(),Python 会先在内存里强行挤出空间存下这一百万个元组,然后再开始循环,这简直是性能自杀

在现实生活中,我们数数通常从 1 开始,而不是从 0 开始。enumerate 允许你通过 start 参数直接修改起始数字,而不需要手动写 index + 1

1
2
for i, day in enumerate(listname, start=1):
print(f"星期 {i}{day}")

四、增删改列表元素

(一)、添加列表元素

  • 使用append函数

仅实现追加一个元素到列表尾部,且只接受一个参数。

语法:listname.append('object')

注意,这个语法没有返回值。

1
2
3
listname = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']
listname.append('saturday')
print(listname)
  • 使用extend函数

在列表末尾一次性追加另一个序列中的多个值,常用于新列表扩展原来的列表。

语法类似:listname.append('object'),同样没有返回值

1
2
3
4
workday = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']
weekend = ['saturday','sunday']
workday.extend(weekend)
print(workday)
  • 使用insert函数(无返回值)
1
listname.insert(index,object)

index指object要插入的位置

  • 使用+号
1
2
3
workday = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']
weekend = ['saturday','sunday']
print(workday+weekdend)

(二)、修改列表元素

1
2
3
workday = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']
workday[4]='holiday'
print(workday)

与C语言类似

(三)、删除列表元素

  • 使用del语句

在 Python 的内存管理模型中,**变量名(Name)对象(Object)**是分离的。

变量名:存储在命名空间(Namespace)中的一个标签。

对象:存储在堆内存(Heap Memory)中的实际数据。

当你执行 del x 时,Python 会从当前的命名空间中注销了 x 这个标识符

也可以删除列表元素

1
2
3
weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
del weekdays[2]
print(f"删除后: {weekdays}")