4_操作列表
1.遍历列表
-
你经常需要遍历列表中的所有元素,对每个元素执行相同的操作。比如,在游戏中,可能需要将每个界面元素 平移相同的距离;在网站中,可能需要显示文章列表中的标题等,此时你可使用Python中的for循环。格式:
for i in list:
,其中i
只是定义了一个变量,你可以写成其他任意名字的变量。 -
在for循环中执行更多操作
-
在for循环中,想包含多少行代码都可以。每个缩进的代码行都是循环的一部分,且将针对列表中的每个值都执行一次。
-
格式:
for i in [可迭代对象]:
,可迭代对象包括字符串、列表、元组、字典、range()
等,在末尾处不要忘了:
。例如:citys = ['郑州','北京','上海','深圳',] for city in citys: print('{}的索引是:{}'.format(city,citys.index(city)),end = ' ') print()
运行结果:
郑州的索引是:0
北京的索引是:1
上海的索引是:2
深圳的索引是:3这让Python获取列表citys中的第一个值,并将其存储到变量city中。接下来Python读取下一行代码,打印city的值——‘郑州’,然后再打印改值在列表中的索引。鉴于该列表还包含其他值,python返回到循环的第一行,获取列表中的下一个元素——‘北京’,并将其存储到变量city中,再执行打印代码,打印city的值——‘北京’……直到循环到列表中最后一个元素,此for循环结束。
-
-
在for循环结束后 执其他的操作
- 当for循环结束之后,我们还可以执行其他的操作。那么接下来的代码就不是循环体的部分了,所以需要顶格写,不需要缩进。例如:
```python
citys = ['郑州','北京','上海','深圳',]
for city in citys:
print(city,end = ' ')
print('遍历列表结束。')
```
> 运行结果:
> 郑州 北京 上海 深圳
> 遍历列表结束。
-
使用while循环遍历列表
-
除了for循环遍历列表外,还可以使用while循环遍历列表,例如:
num = [1,2,3,4,5,6,] i = 0 while i < len(num): print(num[i],end = '') i += 1
运行结果
1 2 3 4 5 6
-
-
python中代码块的关系
- Python根据缩进来判断该代码行与前一行代码行的关系。比如循环体的代码块应在循环条件的下一行进行缩进(4个空格)。
2.创建数值列表
-
数值列表很有用,例如,在游戏中,需要需要跟踪玩家的几个最高分,在数据可视化中,处理的几乎都是有数字(温度、距离、人口数量)组成的。列表非常适用于存储数字集合,而python提供了很多工具,可帮助我们高效地处理数字列表。
-
使用函数range()
-
Python函数
range()
让你能够轻松地生成一系列的数字 -
格式:
range(start,end,[step])
- start 指的是计数起始值,默认是 0 ;
- stop 指的是计数结束值,但不包括 stop ;
- step 是步长,默认为 1,不可以为 0 。
-
生成从你指定的第一个值
start
开始数,步数为step
,并在达到你指定的第二个值后end
停止的数字里列表。例如:# for i in range(4): # 等同于 ↓ for i in range(0,4): print(i ,end = '') ''' 运行结果: 0 1 2 3 '''
for i in range(0,6,2): print(i ,end = '') ''' 运行结果: 0 2 4 '''
-
注意:range()函数
- start 的值必须小于 end 的值。
- 它表示的是左闭右开区间;
- 它接收的参数必须是整数,可以是负数,当参数为负数时,start和end两个参数都要指定,但不能是浮点数等其它类型;
- 它是不可变的序列类型,可以进行判断元素、查找元素、切片等操作,但不能修改元素;
- 它是可迭代对象,却不是迭代器。
-
常见的range()函数的语法:
for num1 in range(3): print(num1,end='') # 运行结果:0 1 2 for num2 in range(0,3): print(num2,end='') # 运行结果:0 1 2 for num3 in range(0,6,2): print(num3,end='') # 运行结果:0 2 4 for num4 in range(-4,-1): print(num4,end='') # 运行结果:-4 -3 -2 for num5 in range(-4,-1,2): print(num5,end='') # 运行结果:-4 -2 num = range(1,10) print(num[3]) # 运行结果:4 num = range(1,10) for i in num[:-3]: print(i ,end = '') # 运行结果:1 2 3 4 5 6
-
以下是错误的语法
for i in range(1,3.1): print(i) ''' Traceback (most recent call last): ... for i in range(1,3.1): TypeError: 'float' object cannot be interpreted as an integer ''' for num in range(-3): print(num) ''' 输出为空白,且不报错 ''' num = range(1,10) num[0] = 11 print(num) ''' Traceback (most recent call last): ... num[0] = 11 TypeError: 'range' object does not support item assignment '''
-
-
使用range()创建数字列表
-
要创建数字列表,可使用函数
list()
,将range()
的结果直接转换为列表。如果将range()作为list()的参数,输出将是一个数字列表。例如:numbers = list(range(0,6,2)) print(numbers) # 输出结果:[0,2,4]
-
-
对数字列表执行简单的统计计算
-
min(num_list)
返回列表中最小值; -
max(num_list)
返回列表中最大值 ; -
sum(num_list)
返回列表中所有数字相加的和nums = list(range(0,10,2)) print(nums) print('列表中最小值:{}'.format(min(nums))) print('列表中最大值:{}'.format(max(nums))) print('列表中的和是:{}'.format(sum(nums)))
运行结果:
[0, 2, 4, 6, 8]
列表中最小值:0
列表中最大值:8
列表中的和是:20
-
3.列表解析
-
列表解析是将for循环和创建新元素的代码合并成一行,并自动附加新元素 。
-
比如,生成一个1~10平方的列表。
squarts = [i ** 2 for i in range(1,11)] print(squarts)
运行结果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
-
要使用这种语法,首先指定一个描述性的列表名。然后,指定一个左方括号,并定义一个表达式,用于生成要存储到列表中的值。接下来,编写一个for循环,用于给表达式提供值,再加上右方括号。注意:这里的for循环语句末尾没有冒号
:
4.使用列表的一部分
-
切片
-
要创建切片,可指定要使用的第一个元素和最后一个元素的索引,python在到达你指定的第二个索引前面的元素后停止。比如,要输出列表中的前五个元素,需要指出索引0~5,list[0:5]。遵循左闭右开原则,可以理解为左边的值可以取到,右边的值取不到。
-
格式:
list[start:end:direction]
-
注意:
-
你可以不指定
start
和end
索引,当你这样做时,会将整个列表截取; -
你可以只指定
start
的值,当你这样做时,会从你指定索引开始,截取到列表最后一个元素; -
你可以只指定
end
的值,当你这样做时,会从列表第一个元素开始,截取到指定索引的前面一个元素; -
无论你使用那一种,中间的冒号
:
不能省略; -
你还可以指定
direction
的值来设定开始的方向。默认是从左向右取值,当direction
为-1
时代表从右向左取值,此时start
的索引应该大于end
的索引。比如:num_list = [1,2,3,4,5,6,7,8,9] print(num_list[5:]) print(num_list[:4]) print(num_list[1:5]) print(num_list[5:1:-1]) print(num_list[-5:-1]) print(num_list[-1:-5:-1])
执行结果:
[6,7,8,9]
[1,2,3,4]
[2,3,4,5]
[6,5,4,3]
[5,6,7,8]
[9,8,7,6]
-
-
总结
- 当要求需要获取前几个元素,就将参数写为几,且只指定一个参数。例如:获取前4个元素,list[:4]
- 当要求获取第几个到第几个元素时,start的索引需要减1而end的索引不需要减1,例如:获取第3个到第7个,list[2:7];
- 当获取倒数第几个时,不需要将索引减1,例如:获取倒数第5个,list[-5] 。
-
-
遍历切片
- 你可以像遍历列表那样遍历列表的切片
- 格式:
for i in list[start:end]:
-
复制列表
- 将一个列表直接赋值给另外一个列表
- 格式:
list2 = list1
- 这种语法实际上是让python 将新变量list2关联到包含在list1中的列表,因此两个变量都指向同一个列表。也就是说当我们修改其中一个列表的值时,另外一个列表也会改变。
-
切片和复制列表的区别
-
使用list2 = list1[:]这种语法和list2 = list1 这两种语法都能将list1中所有值赋值给list2,但是有时候我们需要修改list2中的值,但是不影响list1,这时,两种语法的差别就显示出来了,请看例子:
# 直接复制列表 list1 = list(range(1,11)) print('修改前list1:{}'.format(list1)) list2 = list1 # ① print('修改前list2:{}'.format(list2)) list2[2] = 11 # ② print('仅修改了list2第三个元素的值后:') print('修改后list1:{}'.format(list1)) print('修改后list2:{}'.format(list2))
运行结果:
修改前list1:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
修改前list2:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
仅修改了list2第三个元素的值后:
修改后list1:[1, 2, 11, 4, 5, 6, 7, 8, 9, 10]
修改后list2:[1, 2, 11, 4, 5, 6, 7, 8, 9, 10]在①处我们直接将list1赋值给list2,然后分别打印list1和list2两个列表,确认两个列表中的元素是一样的;在②处我们只修改了list2中索引为2的(即第3个)元素,然后分别打印list1和list2两个列表,发现list1,list2中的元素都发生了变化。
list1 = list(range(1,11)) print('修改前list1:{}'.format(list1)) list2 = list1[:] # ① print('修改前list2:{}'.format(list2)) list2[2] = 0 # ② print('仅修改了list2第三个元素的值后:') print('修改后list1:{}'.format(list1)) print('修改后list2:{}'.format(list2))
运行结果:
修改前list1:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
修改前list2:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
仅修改了list2第三个元素的值后:
修改后list1:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
修改后list2:[1, 2, 0, 4, 5, 6, 7, 8, 9, 10]在①处我们使用切片的方式将list1中的元素全部赋值给list2,然后分别打印list1和list2两个列表,确认两个列表中的元素是一样的;在②处我们只修改了list2中索引为2的(即第3个)元素,然后分别打印list1和list2两个列表,发现只有list2中的元素发生了变化,list1中的值并没有发生变化。
-
-
总结:
- 切片实际上就是先创建列表的副本,然后将副本赋值给新的列表,所以修改任何一个列表不会影响另外一个。
- 复制列表实际上是两个列表同时指向同一个地址,改变任何一个列表,另外一个列表也会发生改变。
7.总结
- 列表非常适合用于存储在程序运行期间可能变化的数据集,因为列表中的元素是可以修改的。
- 在实际应用中列表适合于存储类型单一的数据,比如描述使用列表存储全班的姓名
names = [‘张三’,‘李四’,‘王五’,‘马六’,]
,但是存储一个人的多种信息时,使用列表就不方便了,因为列表智能存储值,而不能对每个元素进行描述。