列表简介
#修改,添加,删除列表元素 #a = 1;b=2;c=3; #print(a*b,b*c);前面遗留的问题
#你创建的大多数列表将是动态的,意味着创建列表后,将随着程序运行增删元素。
#比如,创建一个游戏,玩家射杀从天而降的外星人。为此,可在开始时将一些外星人存储在列表中,
#然后每当外星人被射杀时,都将其从列表中删除,而每当有新的外星人出现在屏幕上时,都将其添加到列表中。
#在整个游戏运行期间,外星人列表的长度将不断变化。
##修改列表元素##
###修改列表元素,可指定列表名和要修改的元素索引,再指定该元素的新值。###
motorcycles = ['honda','yamaha','suzuki'];
print(motorcycles); #['honda', 'yamaha', 'suzuki']
# 修改列表元素 #
motorcycles[0] = 'ducati';
print(motorcycles); #['ducati', 'yamaha', 'suzuki']
#你可以修改任何列表元素的值,而不仅仅是第一个元素的值
##在列表中添加元素##
#列如,你希望游戏中出现新的外星人,添加可视化数据或给网站添加新注册的用户。
#python提供了多种在既有列表中添加新数据的方式
###在列表末尾添加元素###
#在列表末尾添加元素时,最简单的方式是,将元素附加到列表。给列表附加元素时,它将添加到列表末尾。
motorcycles = ['honda','yamaha','suzuki'];
print(motorcycles); #['honda', 'yamaha', 'suzuki']
motorcycles.append('xiaoying');
print(motorcycles); #['honda', 'yamaha', 'suzuki', 'xiaoying']
#方法append()将元素'xiaoying'添加到列表末尾,而不会影响列表中的其他所有元素。
##方法append()让动态地创建列表易如反掌。##
#例如,你可以创建一个空列表,在使用一系列函数调用append()来添加元素。
#下面来创建一个空列表,再在其中添加元素'honda','yamaha','suzuki'
motorcycles = [];
motorcycles.append('honda');
motorcycles.append('yamaha');
motorcycles.append('suzuki');
print(motorcycles); #['honda', 'yamaha', 'suzuki']
#这种创建列表的方式极其常见,因为经常要等程序运行后,你才知道用户要在程序中存储哪些数据。
#为控制用户,可创建一个空列表,用于存储用户将要输入的值,然后将用户提供的每个新值添加到列表中。
##在列表中插入元素##
###使用方法insert()可在列表的任何位置添加新元素。为此,你需要指定新元素的索引和值。
motorcycles = ['honda','yamaha','suzuki'];
motorcycles.insert(0,'xiaoying');
motorcycles.insert(3,'XY',);
print(motorcycles); #['xiaoying', 'honda', 'yamaha', 'XY', 'suzuki']
##这个示例中,值'xiaoying'和值'XY'被插入到列表开头和倒数第二。方法insert()在索引0和3处添加空间,
##并将值'xiaoying'和值'XY'存储到这个地方。
#这种操作将列表中的既有的每个元素都向右移一个位置。
###注意,列表插入后索引就会更新###
motorcycles = ['honda','yamaha','suzuki'];
motorcycles.insert(3,'xiaoying');
print(motorcycles); #['honda', 'yamaha', 'suzuki', 'xiaoying']
motorcycles.insert(4,'bycycle');
print(motorcycles); #['honda', 'yamaha', 'suzuki', 'xiaoying', 'bycycle']
##从列表中删除元素##
#经常需要删除列表中的一个或多个元素。例如,玩家将空中的一个外星人射杀后,
#你可能需要将其从存活的外星人列表中删除。当用户在你创建的web应用中注销账户时,
#你就需要将该用户从活动用户列表中删除。你可以根据位置或值来删除列表中的元素。
###使用del语句永久删除元素###
motorcycles = ['honda','yamaha','suzuki'];
print(motorcycles); #['honda', 'yamaha', 'suzuki']
del motorcycles[1];
print(motorcycles); #['honda', 'suzuki']这里删除了索引为1的元素'yamaha'
###del可以删除任意位置处的列表元素,条件是知道其索引,
#并且是永久删除,无法再访问它(也就是值删除的元素哦)###
print(motorcycles[1]); #suzuki
#使用方法pop()删除元素
#有时候,你需要将元素从列表中删除,并接着使用它的值,例如,你可能需要获取刚被击杀的外星人的x和y的坐标,
#以便在相同位置显示爆炸效果,在web应用程序中,你可能要将用户从活跃成员列表中删除,
#并将其加入到非活跃成员列表中。
#方法pop()删除列表末尾的元素,并让你能够接着使用它。术语弹出pop()源自这样的类比,列表就像一个栈,
#而删除列表末尾的元素相当于弹出栈顶元素。
#从列表motorcycle中弹出一款摩托车
#定义并打印列表motorcycles
motorcycles = ['honda','yamaha','suzuki']
print(motorcycles) #['honda', 'yamaha', 'suzuki']
#从这个列表中弹出一个值,并将其赋给变量popped_motorcycle中,然后打印这个列表,以核实从中删除了一个值。
#最后打印弹出的值,以证明我们依然能访问被删除的值
popped_motorcycle = motorcycles.pop()
print(motorcycles) #['honda', 'yamaha']
print(popped_motorcycle) #suzuki
#输出表明,列表末尾的值'suzuki'已删除,它现在被赋给了变量popped_motorcycle
#方法pop()有什么用呢?假设列表中的摩托车是按购买的时间存储的,就可以使用pop()打印一条消息,
#指出最后购买的是哪款摩托车
motorcycles = ['honda','yamaha','suzuki']
last_owned = motorcycles.pop()
print(f"The last motorcycle I owned was a {last_owned.title()}.") #The last motorcycle I owned was a Suzuki.
##弹出列表中任意位置处的元素##
#实际上,可以使用pop()来删除任意位置的元素,只需要在圆括号中指定要删除元素的索引即可
motorcycles = ['honda','yamaha','suzuki']
last_owned = motorcycles.pop(1)
print(f"The last motorcycle I owned was a {last_owned.title()}.") #The last motorcycle I owned was a Yamaha.
#但是别忘了,每当你使用pop()时,被弹出的元素就不在列表中了
#总结,del语句删除的元素就不能再访问了,方法pop()删除元素后还能继续使用它
###根据值删除元素###
#有时候,不知道要删除的值在列表中的位置,如果只知道要删除元素的值,可以使用方法remove()
motorcycles = ['honda','yamaha','suzuki','ducati']
print(motorcycles) #['honda', 'yamaha', 'suzuki', 'ducati']
#假设从列表motorcycles中删除值'ducati'
motorcycles.remove('ducati')
print(motorcycles) #['honda', 'yamaha', 'suzuki']
#使用方法remove()从列表中删除元素,也可以继续使用它。
#打印删除值'ducati'并打印一条消息,指出从列表中将其删除的原因
motorcycles = ['honda','yamaha','suzuki','ducati']
print(motorcycles)
#将值'ducati'赋给变量too_expensive
too_expensive = 'ducati'
motorcycles.remove(too_expensive)
print(motorcycles)
print(f"\nA {too_expensive.title()} is too expensive for me") #A Ducati is too expensive for me
#方法remove()只能删除第一个指定的值,如果要删除的值在列表中出现多次,就需要使用循环来确保每个值都删除
motorcycles = ['honda','yamaha','ducati','suzuki','ducati']
print(motorcycles) #['honda', 'yamaha', 'ducati', 'suzuki', 'ducati']
too_expensive = 'ducati'
motorcycles.remove(too_expensive)
print(motorcycles) #['honda', 'yamaha', 'suzuki', 'ducati']
###组织列表###
#创建的列表中,元素排列顺序常常是无法预测的,因为你并非总能控制用户提供数据的顺序。
#有时候,你希望保留列表元素最初的排列顺序,而有时候你又需要调整排列顺序
###使用方法sort()对列表永久排序###
#假设让汽车列表按字母顺序排列,为简化这项任务,假设列表中使用值都是小写的
##建立一个cars.py文件(其他文件自己取名,后面不再演示)
cars = ['bmw','audi','toyota','subaru']
cars.sort()
print(cars) #['audi', 'bmw', 'subaru', 'toyota']
#方法sort()永久性地修改列表元素的排列顺序。现在汽车按字母顺序排列,再也无法恢复到原来的排列顺序
###还可以按与字母相反的顺序排列列表元素,只需向sort()方法传递参数reverse=True即可,同样也是永久性地修改
cars = ['bmw','audi','toyota','subaru']
cars.sort(reverse=True)
print(cars) #['audi', 'bmw', 'subaru', 'toyota'] #['toyota', 'subaru', 'bmw', 'audi']
##使用函数sorted()对列表临时排序##
#保留列表元素原来的排列顺序,同时以特定顺序呈现它们,不会影响列表中的原始排列顺序,可使用函数sorted()
cars = ['bmw','audi','toyota','subaru']
print('Here is the original list:')
print(cars)
print('Here is the sorted list:')
print(sorted(cars))
print('Here is the original list again:')
print(cars)
'''
Here is the original list:
['bmw', 'audi', 'toyota', 'subaru']
Here is the sorted list:
['audi', 'bmw', 'subaru', 'toyota']
Here is the original list again:
['bmw', 'audi', 'toyota', 'subaru']
'''
##首先按原始打印顺序打印列表,再按字母顺序显示列表,以特定顺序显示列表后,
##最后确认列表元素的排列顺序与以前相同
###当然也可以按与字母相反顺序显示列表,[也就是传递参数reverse=True],print(sorted(cars,reverse=True))###
#当然并非所有的值都是小写的,按字母顺序排列列表要复杂些,决定排列顺序时,有多种解读大写字母的方式
#要指定准确的排列顺序,可能比我们这里所做的要复杂。然而,大多数排序方式是以本节介绍的知识为基础的
###倒着打印列表###
#要反转列表元素的排列顺序,使用方法reverse()
#假设汽车列表是按购买时间排列的,可轻松地按相反的顺序排列其中的汽车
cars = ['bmw','audi','toyota','subaru']
print(cars) #['bmw', 'audi', 'toyota', 'subaru']
cars.reverse()
print(cars) #['subaru', 'toyota', 'audi', 'bmw']
#####注意:reverse()方法,不是按与字母顺序相反的顺序排列列表元素,而只是反转列表元素的排列顺序#####
###方法reverse()也是永久性地修改列表元素的排列顺序,但随时可以恢复到原来的顺序,只需再调用一次方法reverse()即可
##确定列表的长度##
#使用函数len()可快速获悉列表的长度,
cars = ['bmw','audi','toyota','subaru','xiaoying']
print(len(cars)) #5
#函数len()很有用,如明确还有多少个外星人未被击杀,明确需要管理多少项可视化数据,计算网站有多少注册用户,等等...
###Python计算列表元素数时是从1开始的,因此确定列表长度时,你应该不会遇到差一错误
###使用列表时避免索引错误###
#只有三个元素,你却要访问第4个元素,这将导致索引错误
motorcycles = ['honda','yamaha','suzuki']
# print(motorcycles[3])
'''
Traceback (most recent call last):
File "D:\python\python_work\operating_elements_list.py", line 236, in <module>
print(motorcycles[3])
IndexError: list index out of range
'''
#Python试图向你提供位于索引3处的元素,但它搜索列表motorcycles时,却发现索引为3处没有元素。
#鉴于列表索引差一的特征,这种错误很常见。有些人从1开始数,因此以为第三个元素的索引是3。然而在Python中
#第三个元素的索引是2,因为索引是从0开始的。
#索引错误就意味着Python在指定索引处找不到元素。程序发生索引错误时,请尝试将指定的索引减1,然后再运行程序,看看结果是否正确
###别忘了,每当需要访问最后一个列表元素时,都可以使用索引-1,(多个元素中,当然还可以使用索引-2,-3...)
###这在任何情况下都行之有效,即便你最后一次访问列表后,其长度发生变化。索引-1总是返回最后一个列表元素
motorcycles = ['honda','yamaha','suzuki']
print(motorcycles[-1]) #suzuki
#仅当列表为空时,这种索引-1访问最后一个元素才会导致错误
motorcycles = []
#print(motorcycles[-1])
#列表motorcycles不包含任何元素,因此Python返回一条索引错误消息
'''
Traceback (most recent call last):
File "D:\python\python_work\operating_elements_list.py", line 258, in <module>
print(motorcycles[-1])
IndexError: list index out of range
'''
###注意:发生索引错误却找不到方法时,请尝试将列表或其长度打印出来。列表可能与你以为的截然不同,
###在程序对其进行了动态处理时尤为如此。通过查看列表或其包含的元素数,可帮助你找出这种逻辑错误。