首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

简单的列表操作

操作列表

本次主要去了解如何创建简单的列表,如何操作列表元素,如何遍历整个列表,无论列表多长,只需要几行代码就可以搞定,循环让你能够对列表的每一个元素都采取一个或一系列相同的措施,从而高效地处理任何长度的列表,包括包含数千乃至数百万个元素列表。

1.遍历整个列表

你经常需要遍历列表的所有元素,对每个元素执行相同的操作,例如,在游戏中,可能需要对每个元素都执行相同的操作时,可使用python中的for循环。

假设我们有一个魔术师名单,需要将其中的每个魔术师的名字都打印出来,为此,我们可以分别获取名单中的每个名字,但是,这会导致很多问题,如果名单很长,上千个魔术师,你就得写大量重复的代码,而且,如果名单的长度发生变化时,你又得去修改,所以,我们可以使用for循环去处理这些问题。

下面使用for循环来打印魔术师名单中的所有名字:

magicians=['alice','david','carolina']

for magician in magicians:

print('magician)

打印结果如下:

alice

david

carolina

上述例子中,首先我们先定义一个列表,接下来,我们定义一个for循环,这行代码让python从列表magicians中取一个名字,并将其存储在变量magician中,最后,我们让python打印前面存储到变量magician中的名字,这样,对于列表中的每个名字,python都将重复执行第二行和第三行代码,直到所有的魔术师都被打印完。

2. 深入研究循环

循环这种概念很重要,因为它是让计算机自动完成重复工作的常见之一,例如,在上述的示例中,python首先读取这一行代码:

for magician in magicians:

这行代码让python获取列表magicians中的第一个值alice,并将其存储到变量magician中,接下来,python读取下一行代码:

python(magician)

它让python打印magician的值——依然是alice,鉴于该列表还有其它值,python返回到循环第一行:

for magician in magicians:

开始获取下一个名字——david,并将其存储在变量magician中再次执行下面这一行代码:

python(magician)

python再次打印变量magician中的值——david,接下来,python再次执行整个循环,对列表中的最后一个值——carolina进行处理,至此,列表中没有其它值了,因此,python接着执行程序下一行代码,在这个示例中,for循环后面没有其它的代码,因此程序就此结束。

刚使用循环需要记住,对列表中的每一个元素,都将执行循环指定的步骤,而不管列表包含多少个元素,如果列表包含一百万个元素,python就重复执行指定步骤一百万次,且通常速度非常快。

编写for循环时,对于用于存储列表中每个值的临时变量,可指定任何名称,然而,选择描述单个列表元素的有意义的名称大有帮助,例如,对于小猫列表,小狗列表和一般性列表,如下编写时不错的选择:

for cat in cats:

for dog in dogs:

for item in list_of_items:

这些命名约定有助于你明白for循环中将对每个元素执行的操作,使用单数和复数式名称,可帮助你判断代码段处理的是单个列表还是整个列表。

3.在for循环中执行更多的操作

在for循环中,可对每个元素执行任何操作,下面来扩展前面的示例,对于每位魔术师,都打印一条消息,指出他的表演非常精彩。

magicians=['alice','david','carolina']

for magician in magicians:

print(magician+",你的表演非常精彩!")

打印结果:

alice,你的表演非常精彩!

david,你的表演非常精彩!

carolina,你的表演非常精彩!

上述示例中,相比前一个示例,唯一不同的是对于每一位魔术师,都打印了一条以名字为抬头的消息。

在for循环中,想包含多少行代码都可以。

在代码行for magician in magicians后面,每个缩进的代码行都是循环的一部分,且将针对列表中的每个值都执行一次,因此,可对列表中的每个值执行任意次数的操作。

下面再添加一行代码,告诉每位魔术师,期待他的下一次表演:

magicians=['alice','david','carolina']

for magician in magicians:

print(magician+",你的表演非常精彩!")

print("很期待你的下一次表演,"+magician+".\n")

打印结果:

alice,你的表演非常精彩!

很期待你的下一次表演,alice.

david,你的表演非常精彩!

很期待你的下一次表演,david.

carolina,你的表演非常精彩!

很期待你的下一次表演,carolina.

上述例子中由于两行代码都进行了缩进,因此他们都将针对列表中的魔术师执行一次。

在for循环中,想包含多少行代码都可以,实际上,你会发现使用for循环对每个元素执行众多不同的操作很有用。

4.在for循环结束后执行一些操作

for循环结束后再怎么做呢?通常,你需要提供总结性输出或接着执行程序必须完成的其它任务。

在for循环后面,没有缩进的代码都只执行一次,而不会重复执行,下面就来打印一条向全体魔术师致谢的消息,感谢他们的精彩表演。

magicians=['alice','david','carolina']

for magician in magicians:

print(magician+",你的表演非常精彩!")

print("很期待你的下一次表演,"+magician+".\n")

print("感谢所有魔术师的精彩表演!")

打印结果:

alice,你的表演非常精彩!

很期待你的下一次表演,alice.

david,你的表演非常精彩!

很期待你的下一次表演,david.

carolina,你的表演非常精彩!

很期待你的下一次表演,carolina.

感谢所有魔术师的精彩表演!

上述示例中,你会发现,缩进的代码,都针对列表中的魔术师进行了重复执行,然而,最后一行没有缩进的代码,只执行了一次。

使用for循环处理数据是一种对数据集执行整体操作的不错的方式,例如,你可能使用for循环来初始化游戏,遍历角色列表,将每个角色都显示到屏幕上,再在循环后添加一个不缩进的代码块,在屏幕上绘制所有角色后显示一个确认按钮。

5.缩进错误

对于for语句后面且属于循环组成部分的代码行,一定要缩进,如果你忘记了缩进,python会提醒你:

magicians=['alice','david','carolina']

for magician in magicians:

print(magician+",你的表演非常精彩!")

打印结果会报错:

File "D:/项目/pythonone/python/new_python/yuanzu.py", line 3

print(magician)

^

IndentationError: expected an indented block

这种提示,通常解决了for语句后面紧跟的缩进,可消除这种缩进错误。

不必要的缩进:

message=['r','w']

print(message)

打印结果会报错:

File "D:/项目/pythonone/python/new_python/yuanzu.py", line 2

print(message)

^

IndentationError: unexpected indent

上述中说明了你打印行有缩进,原本这行代码无需缩进,因为它并不属于前一行代码,因此python会报错。

开发过程中还会遇到多余的缩进和逻辑错误的缩进,这些错误python是不会报错的,这是属于程序员本身的逻辑错误,这个需要注意,比如下面的例子:

magicians=['alice','david','carolina']

for magician in magicians:

print(magician+",你的表演非常精彩!")

print("很期待你的下一次表演,"+magician+".\n")

print("感谢所有魔术师的精彩表演!")

打印结果:

alice,你的表演非常精彩!

很期待你的下一次表演,alice.

感谢所有魔术师的精彩表演!

david,你的表演非常精彩!

很期待你的下一次表演,david.

感谢所有魔术师的精彩表演!

carolina,你的表演非常精彩!

很期待你的下一次表演,carolina.

感谢所有魔术师的精彩表演!

上述例子中,可以看出,感谢所有魔术师的精彩表演!这句话应该是循环外的一句话,但是这行代码还在缩进内,所以python还会重复去执行,但是这种语法又是合法的,所以python不会报错,需要开发人员自己去注意。还有for循环语句后面的冒号:一定不能忘记,如果开发项目大,为一个冒号报错,这样的错误找起来非常费时间。

6.创建数值列表

需要存储一组数字的原因有很多,例如,在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分,在数据可视化中,处理的几乎都是由数字(如温度,距离,人口数量,经度和纬度等)组合的集合。

列表非常适合用于存储数字集合,而python提供了很多工具,可帮助你高效地处理数字列表。明白如何有效地使用这些工具后,即便列表包含百万个元素,你编写的代码也能够运行得很好。

使用函数range():

python函数range()让你能够轻松地生成一系列的数字,例如,可以像下面这样使用函数range()来打印一系列数字:

for value in range(1,5):

print(value)

打印结果:

1

2

3

4

在这个示例中,range()只是打印数字1~4,这是你在编程语言中经常看到差一行为的结果,函数range()让python从你指定的第一个值开始数,并在到达你指定的第二个值后停止,因此输出不包含第二个值(这里为5),如果要打印1~5,需要使用range(1,6)

for value in range(1,6):

print(value)

打印结果:

这样,输出将从1开始数,到5结束。

使用range()函数时,如果输出不符合预期,请尝试将指定的值加1或减1.

使用range()创建数字列表

要创建数字列表,可使用函数list()将range()的结果直接转换为列表,如果将range()作为list()的参数,输出将为一个数字列表:

numbers=list(range(1,6))

print(numbers)

打印结果:

[1,2,3,4,5]

使用函数range()时,还可指定步长,如打印1~10内的偶数:

even_numbers=list(range(2,11,2))

print(even_numbers)

打印结果:

[2,4,6,8,10]

在上述示例中,函数range()从2开始数,然后不断的加2,直到达或超过终值(11)。

使用函数range()几乎能够创建任何需要的数字集,例如,如何创建一个列表,其中包含前10个整数(即1~10)的平方呢?在python中使用两个星号(**)表示乘方运算,下面将演示如何将前10个整数的平方加入到一个列表中:

squares=[]

for value in range(1,11):

square=value**2

squares.append(square)

print(squares)

打印结果:

[1,4,9,16,25,36,49,64,81,100]

上述示例中,首先我们创建一个空列表,接下来,使用函数range()让python遍历1~10的值,在循环中,计算当前值的平方,并将结果存储到变量square中,然后,将新计算得到的平方值附加到列表squares末尾,最后,循环结束后,打印列表squares。

为了让代码可以更简洁,可不适用临时变量square,而直接将每个计算得到的值附加到列表末尾:

squares=[]

for value in range(1,11):

squares.append(value**2)

print(squares)

打印结果:

[1,4,9,16,25,36,49,64,81,100]

上述在循环中,计算每个值得平方,并立即将结果附加到列表squares的末尾。

对数字列表执行简单的统计计算

有几个专门用于处理数字列表的python函数,例如,你可以轻松地找出数字列表的最大值,最小值和总和:

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

print(min(digits))

print(max(digits))

print(sum(digits))

打印结果:

9

45

列表解析

前面有个例子介绍生成列表squares的方式包含三四行代码,而列表解析让你只需要一行代码就可以搞定。

squares=[value**2 for value in range(1,11)]

print(squares)

打印结果:

[1,4,9,16,25,36,49,64,81,100]

使用这样的语法,首先指定一个描述性的列表名,如squares,然后,指定一个左括号,并定义一个表达式,用于生成你要存储到列表中的值,在这个示例中,表达式为value**2,它计算平方值,接下来,编写一个for循环,用于给表达式提供值,再加上右方括号,在这个示例中,for循环为 for value in range(1,11),它将值1~10提供表达式value**2,请注意,这里的for语句末尾 无需冒号。

7.切片

要创建切片,可指定要使用的第一个元素和最后一个元素的索引,与函数range()一样,python在到达你指定的第二个索引前面的元素后停止,要输出列表中的前三个元素,需要指定索引0~3,将输出0,1和2 的元素,首先创建一个足球队员的列表:

players=['小明','小江','小王','小刘','小李']

print(players[0:3])

打印结果:

['小明','小江','小王']

如果你没有指定第一个索引,python将重头开始:

players=['小明','小江','小王','小刘','小李']

print(players[:4])

打印结果:

['小明','小江','小王','小刘']

如果让切片终止于列表末尾,也可使用类似的语法,例如,如果要提取从第三个元素到列表末尾所有的元素,可将起始索引指定为2,并省略终止索引:

players=['小明','小江','小王','小刘','小李']

print(players[2:])

打印结果:

['小王','小刘','小李']

如果列表非常长,想获取倒数几个元素,你可以使用负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片,如,你要输入名单上面最后三名队员:

players=['小明','小江','小王','小刘','小李']

print(players[-3:])

打印结果:

['小王','小刘','小李']

上述中,即使列表长度发生变化,也只返回最后三名队员。

遍历切片

如果要遍历列表中的部分切片,可在for循环中使用切片,如果我要遍历列表中前三名队员,并打印出他们:

players=['小明','小江','小王','小刘','小李']

for player in players[:3]:

print(player)

打印结果:

小明

小江

小王

在很多情况下,切片都很有用,例如,在编写游戏时,你可以在玩家退出游戏时将其最终得分加入到一个列表中,然后,为获取该玩家的三个最高得分,你可以将该列表按降序排序,再创建一个只包含前三个得分的切片,处理数据时,可使用切片来进行批量处理,编写web应用程序时,可使用切片来分页显示信息,并在每页显示数量合适的信息。

8.复制列表

复制一个列表,也是很常见的,要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。让python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。

比如你有一个列表,里面是你喜欢的零食,但是有一个朋友,为此你要给他创建一个列表,存储他的零食,但是你喜欢的零食他也喜欢,这样你可以通过复制来创建这个列表:

my_foods=['薯片','披萨','洽洽瓜子']

friend_foods=my_foods[:]

print('我喜欢的零食:')

print('my_foods')

print('\n朋友喜欢的零食:')

print('friend_foods')

打印结果:

我喜欢的零食:

['薯片','披萨','洽洽瓜子']

朋友喜欢的零食:

['薯片','披萨','洽洽瓜子']

为了核实我们确实有两个列表,我们可以在每个列表里面添加一种零食:

my_foods=['薯片','披萨','洽洽瓜子']

friend_foods=my_foods[:]

my_foods.append("香辣鸡腿堡")

friend_foods.append("麦辣鸡腿堡")

print('我喜欢的零食:')

print('my_foods')

print('\n朋友喜欢的零食:')

print('friend_foods')

打印结果:

我喜欢的零食:

['薯片','披萨','洽洽瓜子','香辣鸡腿堡']

朋友喜欢的零食:

['薯片','披萨','洽洽瓜子','麦辣鸡腿堡']

上述显示已经添加成功,说明已经成功复制列表。

倘若我们只是简单地将my_foods赋给friend_foods,就不能得到两个列表,例如,下面在不使用切片的情况下直接复制列表的情况:

my_foods=['薯片','披萨','洽洽瓜子']

friend_foods=my_foods

my_foods.append("香辣鸡腿堡")

friend_foods.append("麦辣鸡腿堡")

print('我喜欢的零食:')

print('my_foods')

print('\n朋友喜欢的零食:')

print('friend_foods')

打印结果:

我喜欢的零食:

['薯片','披萨','洽洽瓜子','香辣鸡腿堡','麦辣鸡腿堡']

朋友喜欢的零食:

['薯片','披萨','洽洽瓜子','香辣鸡腿堡','麦辣鸡腿堡']

上述例子中表明,显示的结果一致,很显然,这并非是我想要的结果。

9.元组

列表非常适合用于存储在程序运行期间可能变化的数据集,列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要,然而,有时候你需要创建一系列不可修改的元素,这时候,元组就可以满足你了,python将不能修改的值称为不可变的,而不可变的列表被称为元组。

定义元组

元组看起来犹如列表,但使用圆括号而不是方括号来标识,定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。例如,如果有一个大小不应改变的矩形,可将其长度和宽度存储在一个元组中,从而确保它们是不能修改的:

dimensions=(200,50)

print(dimensions[0])

print(dimensions[1])

打印结果:

200

50

元组是不能修改的,如果我们去修改它,就会报错:

dimensions=(200,50)

dimensions[0]=250

print(dimensions[0])

运行报错:

Traceback (most recent call last):

File "D:/项目/pythonone/python/new_python/yuanzu.py", line 2, in

dimensions[0]=250

TypeError: 'tuple' object does not support item assignmen

由于试图修改元组里面的值是被禁止的,因此python指出不能给元组赋值。

遍历元组中所有的值

像列表一样,也可以使用for循环来遍历元组中的所有值:

dimensions=(200,50)

for dimension in dimensions:

print(dimension)

打印结果:

200

50

和遍历列表时一样,python返回元组中所有的元素。

修改元组变量

虽然不能修改元组中的值,但是可以给存储元组的变量赋值,因此,如果要修改前述矩形的尺寸,可重新定义整个元组:

dimensions=(200,50)

print('最原始的尺寸')

for dimension in dimensions:

print(dimension)

dimensions=(400,100)

print('最新的尺寸')

for dimension in dimensions:

print(dimension)

打印结果:

最原始的尺寸

200

50

最新的尺寸

400

100

上述中,我们首先定义了一个元组,并将其存储的尺寸打印出来,接下来,将一个新元组存储到变量dimensions中,然后打印新的尺寸,这次,python不会报错,因为给元组变量赋值是合法的

相对应列表,元组是更坚定的数据结构,如果需要存储的一组值在程序的整个生命周期内都不变,可使用元组。

小结

通过上述的一些描述,你了解了如何高效地处理列表中的元素,如何使用for循环遍历列表,python如何根据缩进来确定程序的结构以及避免一些常见的缩进错误,如何创建简单的数字列表,以及可对数字列表执行的一些操作,如何操作切片,还有元组。

写到手酸!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180315G05F3A00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券