文章目录
二、使用列表
先定义列表
list1 = [1, 3, 5, 7, 100]
list2 = ['hello'] * 5
1.计算列表长度(元素个数)
print(len(list1))
print(len(list2))
这里会发现list1和list2的长度都为5,所以列表的长度是以逗号为一个长度的。
2.下标(索引)运算
print(list1[0])
print(list1[4])
# print(list1[5]) # IndexError: list index out of range
print(list1[-1])
print(list1[-3])
# 替换 将5替换成300
list1[2] = 300
print(list1)
列表位置和字符串位置相似,省略。
3.添加元素
list1.append(200)
list1.insert(1, 400)
list1 += [1000, 2000]
print(list1)
print(len(list1))
append是在末尾追加
insert可以选位置追加
+=在末尾追加任意个
不过+=和append还是有区别的,举个例子(a=[1, 2, 3, (40, 50), [100, 200] ] , b=a, 然后在b上测试,看看结果)
4.删除元素
list1.remove(3)
if 1234 in list1:
list1.remove(1234)
del list1[0]
print(list1)
remove从开始匹配的第一个开始移除
5.清空列表
list1.clear()
print(list1)
这只是清空,并没有删除列表,这时相当于一个空列表
6.切片操作
fruits = ['grape', 'apple', 'strawberry', 'waxberry']
fruits += ['pitaya', 'pear', 'mango']
fruits2 = fruits[1:4]
print(fruits2)
fruits3 = fruits[:]
print(fruits3)
fruits4 = fruits[-3:-1]
print(fruits4)
# 反向切片
fruits5 = fruits[::-1]
print(fruits5)
7.排序操作
正序
fruits=['grape', 'apple', 'strawberry', 'waxberry', 'pitaya', 'pear', 'mango']
fruits11=sorted(fruits)
倒序
fruits12=sorted(fruits,reverse=True)
通过key关键字的长度排序
fruits13=sorted(fruits,key=len)
直接在原来的列表里排序
fruits.sort()
fruits.sort(reverse=True)
fruits.sort(key=len)
关于sort函数使用什么排序(归并排序),sorted 使用了什么排序算法
8.使用列表的生成式语法来创建列表
生成列表容器
import sys
def main():
f = [x for x in range(1, 10)]
print(f)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
f = [x + y for x in 'ABCDE' for y in '1234567']
print(f)
# ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7']
if __name__ == '__main__':
main()
生成列表容器和生成生成器对象对比
import sys
def main():
# 用这种语法需要耗费较多的内存空间
f = [x ** 2 for x in range(1, 1000)]
print(sys.getsizeof(f))
print(f)
# [1, 4, 9, 16, 25, 36, 49, ...........,998001]
# 9024
# 这时候创建的不是一个列表而是一个生成器对象
f = (x ** 2 for x in range(1, 1000))
print(sys.getsizeof(f))
print(f)
for val in f:
print(val)
#
# 120
if __name__ == '__main__':
main()
所以使用生成器较节省空间。
9.生成斐波拉切数列的生成器
def fib(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
yield a
def main():
for val in fib(20):
print(val)
if __name__ == '__main__':
main()
三、使用元祖
元组和列表类似,不同在于元组的元素不能修改
定义元组
t=('tom', 18, 'man', '广州')
print(t)
1.获取元组中的元素
print(t[0])
print(t[3])
如果超过元组的长度会报错
2.遍历元组中的值
for member in t:
print(member)
3.重新赋值
t=('tim', 18, 'man', '广州')
print(t)
元组是不可以直接修改的
4.将元祖转换成列表
person = list(t)
print(person)
# 这时候列表是可以修改的
person[0]='tom'
print(person)
5.将列表转换成元组
tt=tuple(person)
print(tt)
# 这时候元组是修改不了的
6.为什么还需要元组???
元组中元素是无法修改的,然而多线程环境中更喜欢不变对象。(一方面因为对象状态不能修改,所以可以避免有此引起的不必要的程序错误,就是说更容易维护;另一方面因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,这样就可以省掉处理同步化的开销。一个不变对象可以方便的被共享访问)
所以:不需要对元素进行添加、删除、修改的时候,可以用元组
元组在创建时间和占用空间上面都优于列表。
在ipython上使用魔法指令%timeit%来分析创建同样的元组和列表所花费的时间
来源:CSDN
作者:匡夆
链接:https://blog.csdn.net/weixin_46108954/article/details/104635696