012 列表的一些常用操作符
列表的一些常用操作符
比较操作符
逻辑操作符
连接操作符
重复操作符
成员关系操作符
比较操作符:
>>> list1 = [123]
>>> list2 = [234]
>>> list1 > list2
False
>>> list2 = [234,123]
>>> list1 = [123,456]
>>> list1 > list2
False
>>>
列表比较是取第0个即(123和234)的大小返回值。
字符串的比较是比较ASC II的大小
当然,逻辑关系也可以比较
>>> list3 = [123,456]
>>> (list1 < list2) and (list1 == list3)
True
>>>
字符串可以用+号作为拼接,也可以用*号作为重复
>>> list4 = list1 + list2
>>> list4
[123, 456, 234, 123]
>>> list0 = list1 * 3
>>> list0
[123, 456, 123, 456, 123, 456]
>>>
相当于之前学过的extend()方法,但+号不能用来新增一个元素进列表,添加元素来扩展列表用之前所学3个方法,显得语法比较规范。
也可以用赋值操作符,如
>>> list3
[123, 456]
>>> list3 *= 3
>>> list3
[123, 456, 123, 456, 123, 456]
>>> list3 *= 5
>>> list3
[123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456]
>>>
成员关系操作符:
>>> 123 in list3
True
>>> 'fishdm' not in list3
True
>>> 123 not in list3
False
>>>
但判断列表里嵌套列表里的元素,看情况如何
>>> list5 = [123,['fishdm','seven'],456]
>>> 'fishdm' in list5
False
>>>
ok,系统只判断第一层列表元素,列表中的列表元素不能判断出来,那如果要判断列表中列表的元素应该如何操作?
>>> 'fishdm' in list5[1]
True
>>>
之前讲过使用索引号访问列表里的值,那么列表中的列表中的值该如何访问呢?
>>> list5[1][1]
'seven'
>>>
列表类型的内置函数(列表的小伙伴们)
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
常用的如append,extend都学过,现在再来看几个比较常用的函数
count()计算它的参数在列表中出现的次数。
>>> list3
[123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456, 123, 456]
>>> list3.count(123)
15
>>>
index()返回参数在列表中的位置,有两个默认的参数。如
>>> list3.index(123)
0
>>> list3.index(123,3,7) #这里是指在list3里的[3:7]里查找(123)的位置,3是指列表list3里的起始位置,7是指结束位置,
4
>>>
reverse()将整个列表原地翻转(逆行)
>>> list5
[456, ['fishdm', 'seven'], 123]
>>> list5.reverse()
>>> list5
[123, ['fishdm', 'seven'], 456]
>>>
sort()用指定的方式对列表成员进行排序,默认是从小到大排序。
>>> list6 = [4,2,5,1,9,23,32,0]
>>> list6.sort()
>>> list6
[0, 1, 2, 4, 5, 9, 23, 32]
>>>
sort()有3个参数:sort(func,key,reverse),无参数是默认从小到大,第一个是指排序的算法,第二个是指跟这个算法搭配的关键词。
第三个参数跟上面的reverse()方法类似,默认参数是false即没有逆行。
>>> list6
[0, 1, 2, 4, 5, 9, 23, 32]
>>> list6.sort(reverse = True)
>>> list6
[32, 23, 9, 5, 4, 2, 1, 0]
>>>
拷贝概念内容的补充:(参考上节课课后练习最后一题)
>>> list6
[32, 23, 9, 5, 4, 2, 1, 0]
>>> list7 = list6[:]
>>> list7
[32, 23, 9, 5, 4, 2, 1, 0]
>>> list8 = list6
>>> list8
[32, 23, 9, 5, 4, 2, 1, 0]
>>> list6.sort()
>>> list6
[0, 1, 2, 4, 5, 9, 23, 32]
>>> list7
[32, 23, 9, 5, 4, 2, 1, 0]
>>> list8
[0, 1, 2, 4, 5, 9, 23, 32]
>>>
list7 = list6[:]
list7是list6的拷贝,拷贝之后list7是新建的一个列表,跟list6无任何关系。当list6改变时,list7还是原来的值。
list8 = list6
list8是list6的指定标签,等于list6的列表有两个标签,当list6改变时,list8跟着改变。
测试题:
0. 注意,这道题跟上节课的那道题有点儿不同,回答完请上机实验或参考答案。
>>> old = [1, 2, 3, 4, 5]
>>> new = old
>>> old = [6]
>>> print(new)
复制代码
如果不上机操作,你觉得会打印什么内容?
答:1,2,3,4,5
1. 请问如何将下边这个列表的'小甲鱼'修改为'小鱿鱼'?
list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]
复制代码
答: list1[1][2][0] = '小鱿鱼'
2. 要对一个列表进行顺序排序,请问使用什么方法?
答:list1.sort()
3. 要对一个列表进行逆序排序,请问使用什么方法?
答:list1.reverse()
论坛参考答案:
>>> 列表名.sort()
>>> 列表名.reverse()
或者
>>> 列表名.sort(reverse=True)
先顺序,再逆序
4. 列表还有两个内置方法没给大家介绍,不过聪明的你应该可以自己摸索使用的门道吧:copy() 和 clear()
答:
>>> list1
[1, [1, 2, ['小鱿鱼']], 3, 5, 8, 13, 18]
>>> list1.copy()
[1, [1, 2, ['小鱿鱼']], 3, 5, 8, 13, 18]
>>> list1.clear()
>>> list1
[]
>>>
5. 你有听说过列表推导式或列表解析吗?
没听过?!没关系,我们现场来学习一下吧,看表达式:
>>> [ i*i for i in range(10) ]
复制代码
你觉得会打印什么内容?
>>> [i*i for i in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
复制代码
居然分别打印了0到9各个数的平方,然后还放在列表里边了有木有?!
列表推导式(List comprehensions)也叫列表解析,灵感取自函数式编程语言 Haskell。Ta 是一个非常有用和灵活的工具,可以用来动态的创建列表,语法如:
[有关A的表达式 for A in B]
例如
>>> list1 = [x**2 for x in range(10)]
>>> list1
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
复制代码
相当于
list1 = []
for x in range(10):
list1.append(x**2)
复制代码
问题:请先在 IDLE 中获得下边列表的结果,并按照上方例子把列表推导式还原出来。
>>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]
复制代码
答:结果不一样呀!!!!
list1 = []
for x in range(10):
for y in range(10):
if x%2 == 0:
if y%2 != 0:
list1.append((x,y))
print (list1)
用shell操作:
>>> list1 = []
>>> for x in range(10):
for y in range(10):
if x%2 == 0:
if y%2 != 0:
list1.append((x,y))
>>> list1
[(0, 1), (0, 3), (0, 5), (0, 7), (0, 9), (2, 1), (2, 3), (2, 5), (2, 7), (2, 9), (4, 1), (4, 3), (4, 5), (4, 7), (4, 9), (6, 1), (6, 3), (6, 5), (6, 7), (6, 9), (8, 1), (8, 3), (8, 5), (8, 7), (8, 9)]
>>>
6. 活学活用:请使用列表推导式补充被小甲鱼不小心涂掉的部分
答:不会
表达式容易理解,但还需长时间复习消化才行,不然一转背就忘了。
论坛参考答案:
>>> list3 = [name + ':' + slogan[2:] for slogan in list1 for name in list2 if slogan[0] == name[0]]
复制代码