本文以题来引出python中的特色知识点,一方面是为了巩固一下基础,另一方面为下一阶段学习打好基础。本文涉及到的主要知识点有列表及对列表的相关操作、切片、filter函数、匿名函数及字典等,题目预览如下:
一.将列表倒序输出
问题描述:
假设当前给定列表mylist = [1,2,3,4,5,6,7,8,9,0],要求最终输出为[0,9,8,7,6,5,4,3,2,1],请问如何解决。
解决方案
python中有三种将列表逆序的方法 ,此处的三种方法均为python的内建模块的方法,不包括第三方实现的方法,比如自己写一个循环之类的方法。三种方法如下所示:
方法一:使用切片[::-1]
在此简单说明一下切片的使用:mylist[start:end:step]
上述操作表示取mylist的第start(默认值为0)个到第end(默认值为len(mylist))个元素,且每隔step(step默认为1)个元素取一个。以上start,end,step均为可选项。
mylist = [1,2,3,4,5,6,7,8,9,0]
mylist[::-1]
将输出:
[0,9,8,7,6,5,4,3,2,1]
该方法的优缺点:
- 没有改变原来的列表,且操作方便。
- 另外创建副本来保存列表中的所有元素,故需要更多的内存空间。
- 由于使用了切片的特性,故可读性较差。
方法二:使用mylist.reverse()方法
python的mylist.reverse()
方法会直接在原来的列表里面将元素进行逆序排列,不需要创建新的副本用来存储结果。
mylist = [1,2,3,4,5,6,7,8,9,0]
mylist.reverse()
mylist
输出结果为:
[0,9,8,7,6,5,4,3,2,1]
该方法的优缺点:
- 不必申请新的内存空间来保存结果,节省了内存的使用。
- 修改了原来的数据,不利于后续使用原数据。
方法三:使用reversed()方法
reversed()
方法会将列表逆序的结果存储到迭代器里面,这种方法不会改变原来的列表,也不会创建原来列表的完整副本,而是会多出迭代器对象所占的空间。
mylist = [1,2,3,4,5,6,7,8,9,0]
for item in reversed(mylist):
print(item)
输出结果为:
0
9
8
7
6
5
4
3
2
1
该方法的优缺点:
- 不会改变原来的列表,也无需创建原来列表的完整副本,只会多出迭代器对象所占的空间,相对而言比较高效。
- 可读性较好。
- 但是如果需要得到一个逆序列表的话,该方法的优点便会失效。
二.输出列表的偶数项数据
问题描述:
给出列表mylist = [1,2,3,4,’a’,’b’,’c’,’d’,9,0],要求输出mylist中的所有偶数项数据即:[2,4,’b’,’d’,0]。
解决方案:
使用切片来解决问题
mylist = [1,2,3,4,'a','b','c','d',9,0]
mylist[1:len(mylist):2]
输出结果为:
[2,4,’b’,’d’,0]
三.删除列表中的所有偶数
问题描述:
给出列表mylist = [12,21,3,42,52,61,7,8,99,0],要求删除mylist中的所有偶数值,输出[21,3,61,7,99]。代码不超过两行。
解决方案:使用filter()函数和匿名函数
mylist = [12,21,3,42,52,61,7,8,99,0]
list(filter(lambda x: x % 2 == 1,mylist))
输出结果如下:
[21,3,61,7,99]
匿名函数lambda x : x % 2 != 0
实际上就等于:
def is_odd(x):
return x % 2 == 1
关键字lambda
表示匿名函数,冒号前面的x表示匿名函数的参数,匿名函数有个限制就是只能有一个表达式,不用写return
,返回值就是该表达式的结果。
python内建的filter()
函数用于过滤序列.filter()
函数接受一个函数和一个序列,并把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。
由于filter()
函数返回的是一个Iterator
,也就是一个惰性序列,所以要强迫filter()
完成运算结果,需要用list()
函数获得所有结果并返回list
四.字典值更新
问题描述:
给出字典mydict = {‘a’: 1,’b’: 2},要求更改为mydict = {‘a’: 3,’b’: 4},仅用一行代码实现 。
解决方案:
mydict.update({'a': 3,'b': 4})
mydict
输出结果如下:
{‘a’: 3,’b’: 4}