1.extend():拓展列表
>>> list1=[1,2,3]
>>> list2=[4,5,6]
>>> list1.extend(list2)
>>> list1 #原先的对象会发生变化
[1, 2, 3, 4, 5, 6]
>>> list1=[1,2,3]
>>> list3=list1+list2
>>> list3 #这是另一个对象
[1, 2, 3, 4, 5, 6]
- extend传入的必须是可迭代的对象,比如传入一个int,就报错啦
>>> list1=[1,2,3]
>>> list2="abc"
>>> list1.extend(list2)
>>> list1
[1, 2, 3, 'a', 'b', 'c']
>>> c=4
>>> list1.extend(4)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
list1.extend(4)
TypeError: 'int' object is not iterable
- 更进一步的理解:
>>> list1=[1,2,3]
>>> list2=["Python",'C++','JS']
>>> id(list1)
50643912
>>> id(list2)
5257544
>>> list2.extend(list1)
>>> list2
['Python', 'C++', 'JS', 1, 2, 3]
>>> id(list2)
5257544 #貌似生成新的list2对象,内容拓展了,"窝"还是原来的"窝"
2.可迭代的对象判断---hasattr()
>>> string="python"
>>> hasattr(string,'__iter__')
True
>>> string=[1,2]
>>> hasattr(string,'__iter__')
True
>>> hasattr(3,'__iter__')
False
可以看出,hasattr()是判断对象是否含有"iter"
3.append---另一种拓展列表的函数,都是拓展列表,还是有区别的:
>>> list1=["I","like",'Python']
>>> list2=[1,2,3]
>>> list1.extend(list2)
>>> list1
['I', 'like', 'Python', 1, 2, 3] #list2列表元素在list1不再是列表
>>> list1=["I","like",'Python']
>>> list1.append(list2)
>>> list1
['I', 'like', 'Python', [1, 2, 3]]
>>> list1=["I","like",'Python']
>>> id(list1)
51046856
>>> list1.append(list2)
>>> list1
['I', 'like', 'Python', [1, 2, 3]] #list2依然是列表
>>> id(list1) #可以看到,与extend一样,虽然扩容了,但是"窝"没变
51046856
- extend和append共同点:都能原地扩容列表,对于"原地修改"的理解:
"原地修改"--->没有返回值--->不能赋值给变量
append可以理解为"整体(元素还是整体)",extend可以理解为"局部(元素被拆分)"
扩容后,它们的列表长度是不一样的,这个也要注意下...
>>> list1=[1,2,3]
>>> example=list1.extend([4,5,6])
>>> example #这里啥也没有
>>> print(example) #返回None,即什么都没有
None
4.count()---统计列表元素出现的次数
>>> list1=[1,2,3,1,1,5,6,6,6]
>>> list1.count(1)
3
>>> list1.count(6)
3
>>> list1.count(7) #没有这个元素,不会报错,返回0次
0
>>>
5.insert(i,x)---向列表的任意位置插入元素(extend和append是向列表末尾追加元素),insert()也是没有返回值,或者返回值为None.
>>> list1=[1,2,3,4]
>>> list1.insert(0,1234) #索引0的位置插入1234
>>> list1
[1234, 1, 2, 3, 4]
- 这两种方法是等同的:
>>> list1.insert(len(list1),5)
>>> list1
[1234, 1, 2, 3, 4, 5]
>>> list1=[1234, 1, 2, 3, 4]
>>> list1.append(5)
>>> list1
[1234, 1, 2, 3, 4, 5]
6.删除列表元素的两种方法:remove()和pop():
先看remove():
>>> help(list.remove)
Help on method_descriptor:
remove(...)
#None表示没有返回值
L.remove(value) -> None -- remove first occurrence of value.
Raises ValueError if the value is not present.
- 基础实例:
>>> list1=['a','b','c','d','e','f']
>>> list1.remove('c')
>>> list1
['a', 'b', 'd', 'e', 'f']
>>> list2=['python','go','.net','python']
>>> list2.remove('python')
>>> list2
#只会删除第一个符合条件的元素
['go', '.net', 'python']
- 配合判断,循环,删除全部指定的元素:
list1=['python','js','.net','python']
"""if 'python' in list1:
list1.remove('python')
print(list1)
else:
print('python is not in')"""
for i in list1:
if i=='python':
list1.remove(i)
print(list1)
>>>['js', '.net']
下面介绍pop():
>>> help(list.pop)
Help on method_descriptor:
pop(...)
L.pop([index]) -> item -- remove and return item at index (default last).
Raises IndexError if list is empty or index is out of range.
可以看出,传入的是一个可选的索引(不同于remove传入的是值),如果不传入参数,那么默认的是删除最后一个元素,都是返回这个被删除的元素,pop()是有返回值的.
>>> list1=['a','b','c','d','e']
>>> list1.pop()
'e'
>>> type(list1.pop())
<class 'str'>
>>> list1.pop('c') #传入值会报错,因为要求的是索引
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
list1.pop('c')
TypeError: 'str' object cannot be interpreted as an integer
>>> list1.pop(2)
'c'
>>> list1 #list1变了
['a', 'b']
7.reverse():列表的顺序反过来,没有返回值,区别于内建函数reversed()
列表方法list.reverse()是对list原地修改,list原地改变,故不能再赋值
内建reversed()是有返回值的,不是原地修改,故可以赋值
>>> list1=[1,2,3,4,5,6]
>>> list1.reverse()
>>> list1
[6, 5, 4, 3, 2, 1]
>>> list2=[1,2,3,4,5]
>>> list2.reversed() #reversed()是内建函数,不是列表的方法
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
list2.reversed()
AttributeError: 'list' object has no attribute 'reversed'
>>> reversed(list2)
<list_reverseiterator object at 0x000000000312F5F8>
>>> list(reversed(list2)) #不仅反向,并且有返回值
[5, 4, 3, 2, 1]
>>>
8.list.sort():对列表进行排序,没有返回值
>>> help(list.sort)
Help on method_descriptor:
sort(...)
# key表示关键字字段
L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*
- 实例:
>>> list1=[5,9,3,6,1]
>>> list1.sort()
>>> list1
# 默认从小到大排序
[1, 3, 5, 6, 9]
>>> list1.sort(reverse=True)
>>> list1
# 从大到小
[9, 6, 5, 3, 1]
>>> list2=['']
>>> list2=['C','C++','Java','Python','.net']
# 传入关键字字段
>>> list2.sort(key=len)
>>> list2
['C', 'C++', 'Java', '.net', 'Python']
>>>
- 对比下内建sorted()---有返回值的:
>>> help(sorted)
Help on built-in function sorted in module builtins:
sorted(iterable, key=None, reverse=False)
Return a new list containing all items from the iterable in ascending order.
A custom key function can be supplied to customise the sort order, and the
reverse flag can be set to request the result in descending order.
>>> list1=[5,9,3,6,1]
>>> sorted(list1)
# 直接有返回值的,list.sort()是直接修改原来的列表
[1, 3, 5, 6, 9]
>>> list2=['C','C++','Java','Python','.net']
>>> sorted(list2,key=len)
['C', 'C++', 'Java', '.net', 'Python']
补充:
- 类似"入栈和出栈"的操作---pop()和append()
list1=['a','b','c','d','e','f','g']
list2=[]
Active=True
while Active:
list2.append(list1.pop())
if list1==[]:
#一样的效果
#break
Active=False
print(list2) # ['g', 'f', 'e', 'd', 'c', 'b', 'a']
print(list2[::-1]) # ['a', 'b', 'c', 'd', 'e', 'f', 'g']
#list2没有发生变化
print(list2) # ['g', 'f', 'e', 'd', 'c', 'b', 'a']
- 之前错误的模拟:
list1=['a','b','c','d','e','f','g']
list2=[]
for i in list1:
list2.append(list1.pop())
# 'a'和'b'为什么没有?
# 因为遍历到字符'd'的时候,后面的字符已经不存在了,遍历结束了(此时是不会报错的...)
print(list2) # ['g', 'f', 'e', 'd']
网友评论