字符串和常用的数据结构之列表和元组的使用

风流意气都作罢 提交于 2020-03-05 07:22:12

二、使用列表

先定义列表

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%来分析创建同样的元组和列表所花费的时间

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!