05-Python列表和元组

在这里插入图片描述

在这里插入图片描述


一🥖.列表定义

列表是Python中内置有序可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开;

一个列表中的数据类型可以各不相同,可以同时分别为整数、实数、字符串等基本类型,甚至是列表、字典以及其他自定义类型的对象。

[1,2,3,2.4,5]
[0.01,"zhangsan",[1,2,3]]

创建

  • 使用“=”直接将一个列表赋值给变量即可创建列表对象。例如:a_list = [],b_list = [1,2,3]
  • 使用list()函数将元组、range对象、字符串或其他类型的可迭代对象类型的数据转换为列表。

例如:a_list = list(“Hello”) 将字符串 “hello” 转换成列表 [‘H’,‘e’,‘l’,‘l’,‘o’]

删除

>>>x =[1,2,3]
>>>del  x[1]                    #删除指定位置元素
>>>x
-----------------------------------------------------------
[13]

当不再使用时,使用del命令删除整个列表 例如:

>>>del x                        #删除整个列表
>>>x
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
      x
NameError: name 'x' is not defined

二🍔.列表元素的增加

2.1 append()

向列表尾部追加一个元素,不改变其内存首地址,属于原地操作。 例如:

>>>x = [1,2,3]

>>>x.append(4)

>>>x

[1,2,3,4]
2.2 insert()

向列表任意位置插入一个元素,不改变其内存首地址,属于原地操作。

例如:

>>>x = [1,3,4]

>>>x.insert(1,2)

>>>x

[1,2,3,4]
2.3 extend()

将另一个迭代对象的所有元素添加至该列表对象尾部,不改变其内存首地址,属于原地操作。

例如:

>>>x = [1,2]

>>>x.extend([3,4])

>>>x

[1,2,3,4]
2.4 运算符" + " 和" * "

并不是真的为列表添加元素,而是创建一个新列表,不属于原地操作,而是返回新列表。

>>> x = [1,2,3]

>>>y = x + [4]

>>>y

[1,2,3,4]

>>>y = x*2

>>>y

[1,2,3,4,1,2,3,4]

此时x保持不变,依旧是[1,2,3]

三🥪.列表元素的删除

3.1 pop()

使用列表的pop()方法删除并返回指定(默认为最后一个)位置上的元素,如果给定的索引超出了列表的范围则抛出异常。

>>>x = [1,2,3,4]

>>>x.pop()                        #弹出并返回尾部元素

4

>>>x.pop(1)                     #弹出并返回指定位置的元素

>>>2
3.2 remove()

删除首次出现的指定元素,如果列表中不存在要删除的元素,则抛出异常。

例如:

>>>x = [1,2,2,3,4]

>>>x.remove(2)

>>>x

[1,2,3,4]
3.3 clear()

清空列表。

例如:

>>>x = [1,2,3,4]

>>>x.clear()

>>>x

[ ]
3.4 del

删除列表中的指定位置上的元素。

例如:

>>>x = [1,2,3,4]

>>>del x[1]

>>>x

[1,3,4]

四🍞.列表元素访问与计数

4.1 count()

统计指定元素在列表对象中出现的次数。

例如:

>>> x =[1,2,3,3,4,5]

>>>x.count(3)

2

>>>x.count(0)

0
4.2 index()

获取指定元素首次出现的下标,若列表对象中不存在指定元素,则抛出异常。

例如:

>>>x = [1,2,3,2,2,4]

>>>x.index(2)

1
4.3 in

测试列表中是否存在某元素

例如:

>>>x = [1,2,3,4]

>>>3 in x

True

>>>5 in x

False

五🥮.列表排序

5.1 sort()

按照指定规则对所有元素进行排序,默认规则是直接比较规则大小。

例如:

>>> aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]

>>> import random

>>> random.shuffle(aList)                              #随机降序

>>> aList

[3, 4, 15, 11, 9, 17, 13, 6, 7, 5]

>>> aList.sort()                                              #默认是升序排序

>>> aList.sort(reverse = True)                       #降序排序

>>> aList

[17, 15, 13, 11, 9, 7, 6, 5, 4, 3]
5.2 reverse()

将列表中所有元素原地逆序排列。

例如:

>>>x = [1,3,2,4,6,5]

>>>x.reverse()

>>>x

[5,6,4,2,3,1]
5.3 sorted()

使用内置函数sorted对列表进行排序并返回新列表,不对原列表做任何修改。

例如:

>>>x = [6,4,2,4,1]

>>> sorted(x)                                     #升序排序

[1,2,4,4,6]

>>> sorted(aList,reverse = True)             #降序排序

[6,4,4,2,1]

>>>x

[6,4,2,4,1]
5.4 reversed()

返回一个逆序排列后的迭代对象,不对原列表做任何修改。

>>>x =[1,5,3,6,2]

>>>list(reversed(x))

[2,6,3,5,1]

>>>x

[1,5,3,6,2]

六🍰.用于序列操作的常用内置函数

6.1 len()

返回列表中的元素个数,同样适用于元组、字典、集合、字符串等。

6.2 max()、 min()

返回列表中的最大或最小元素,同样适用于元组、字典、集合、range对象等。

6.3 sum()

对列表的元素进行求和运算。

6.4 zip()

返回可迭代的zip对象。

例如:

>>> aList = [1, 2, 3]

>>> bList = [4, 5, 6]

>>> cList = zip(a, b)                               #返回zip对象

>>> cList

<zip object at 0x0000000003728908>

>>> list(cList)                                         #把zip对象转换成列表

[(1, 4), (2, 5), (3, 6)]
6.5 enumerate()

返回可迭代的zip对象。

例如:

>>> aList = [1, 2, 3]

>>> bList = [4, 5, 6]

>>> cList = zip(a, b)                               #返回zip对象

>>> cList

<zip object at 0x0000000003728908>

>>> list(cList)                                         #把zip对象转换成列表

[(1, 4), (2, 5), (3, 6)]

七🫕.遍历列表和列表推导式

7.1 遍历列表的三种方式
a = ['a','b','c','d','e','f']
for i in a:
    print(i)

for i in range(len(a)):
    print(i,a[i])
    
for i,ele in enumerate(a):
    print(i,ele)
7.2 列表推导式

列表推导式使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性。

语法形式:

[表达式 for 变量 in 序列或迭代对象]

列表推导式在逻辑上相当于一个循环,只是形式更加简洁。

lis = [i for i in range(100)]
print(lis)

使用列表推导式实现嵌套列表的平铺

>>> vec = [[1,2,3], [4,5,6], [7,8,9]]

>>> [num for elem in vec for num in elem]

[1, 2, 3, 4, 5, 6, 7, 8, 9]

相当于:

>>> vec = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> result = []

>>> for elem in vec:

    for num in elem:

  result.append(num)

>>> result

[1, 2, 3, 4, 5, 6, 7, 8, 9]

过滤不符合条件的元素 从列表中选择符合条件的元素组成新的列表

>>> aList = [-1,-4,6,7.5,-2.3,9,-11]

>>> [i for i in aList if i>0]

[6, 7.5, 9]

在列表推导式中使用多个循环,实现多序列元素的任意组合,并且可以结合条件语句过滤特定元素

>>> [(x, y) for x in range(3) for y in range(3)]

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

>>> [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

列表综合练习

写一个循环,不断的问用户想买什么,用户选择一个商品编号,就把对应的商品添加到购物车里,最终用户输入q退出时,打印购物车里的商品列表

products = [['iphone',6888],['三星',3000],['小米',2500]]
shopping_car = []
flag = True
while flag:
    print("******商品列表******")
    for index,i in enumerate(products):
        print("%s.  %s|  %s" %(index,i[0],i[1]))
    choice = input("请输入您想购买的商品的编号:")
    if choice.isdigit():#isdigit()判断变量是什么类型
        choice = int(choice)
        if choice>=0 and choice<len(products):
            shopping_car.append(products[choice])
            print("已经将%s加入购物车" %(products[choice]))
        else:
            print("该商品不存在")
    elif choice == "q":
        if len(shopping_car)>0:
            print("您打算购买以下商品:")
            for index,i in enumerate(shopping_car):
                print("%s. %s|  %s" %(index,i[0],i[1]))
        else:
            print("您的购物车中没有添加商品")
        flag = False

八🍡.列表切片

列表元素支持用索引访问,正向索引从0开始

colors=["red","blue","green"]

print(colors[0])

print(colors[1])
---------------------------------
red  
blue

同时,也可以使用负向索引(python中有序序列都支持负向索引)

print(colors[-1])
---------------------------------
green
8.1 列表的切片操作

切片操作不是列表特有的,python中的有序序列都支持切片,如字符串,元组。

切片的返回结果类型和切片对象类型一致,返回的是切片对象的子序列,如:对一个列表切片返回一个列表,字符串切片返回字符串。

li=["A","B","C","D"]

格式: li[start : end : step]

start是切片起点索引,end是切片终点索引,但切片结果不包括终点索引的值。step是步长默认是1。

      t=li[0:3]        ["A","B","C"]        #起点的0索引可以省略,t=li[:3]

      t=li[2: ]        ["C","D"]           #省略end,则切到末尾

      t=li[1:3]        ["B","C"]

      t=li[0:4:2]       ["A","C"]       #从li[0]到li[3],设定步长为2。

如何确定start和end,他们是什么关系? 在step的符号一定的情况下,start和end可以混合使用正向和反向索引,无论怎样,你都要保证 start和end之间有和step方向一致元素 间隔,否则会切出空列表

t=li[0:2]

t=li[0:-2]

t=li[-4:-2]

t=li[-4:2]

上面的结果都是一样的;t为[“A”,“B”]

t=li[-1:-3:-1]

t=li[-1:1:-1]

t=li[3:1:-1]

t=li[3:-3:-1]

上面的结果都是一样的;t为[“D”,“C”]

t=li[-1:-3]

t=li[-1:1]

t=li[3:1]

t=li[3:-3]

都切出空列表

同时,step的正负决定了切片结果的元素采集的先后

省略start 和 end表示以原列表全部为目标

t=li[::-1]     t--->["D","C","B","A"]   #反向切,切出全部 

t=li[:]        t--->["A","B","C","D"]   #正向切全部
8.2 使用切片来原地修改列表内容
>>> aList = [3, 5, 7]

>>> aList[len(aList):] = [9]               #在尾部追加元素

>>> aList

[3, 5, 7, 9]

>>> aList[:3] = [1, 2, 3]                  #替换前3个元素

>>> aList

[1, 2, 3, 9]

>>> aList[:3] = []                         #删除前3个元素

>>> aList

[9]
8.3 使用del与切片结合来删除列表元素
>>> aList = [3,5,7,9,11]

>>> del aList[:3]                          #删除前3个元素

>>> aList

[9, 11]



>>> aList = [3,5,7,9,11]

>>> del aList[::2]                         #删除偶数位置上的元素

>>> aList

[5, 9]
8.4 切片返回的是列表元素的浅复制

所谓浅复制,是指生成一个新的列表,并且把原列表中所有元素的引用都复制到新列表中。

例如:

>>> aList = [3, 5, 7]

>>> bList = aList              #bList与aList指向同一个内存

>>> bList

[3, 5, 7]

>>> bList[1] = 8                #修改其中一个对象会影响另一个

>>> aList

[3, 8, 7]

>>> aList == bList             #两个列表的元素完全一样

True

>>> aList is bList              #两个列表是同一个对象

True

>>> id(aList)                     #内存地址相同

19061816

>>> id(bList)

19061816

>>> aList = [3, 5, 7]

>>> bList = aList[::]                 #切片,浅复制

>>> aList == bList                    #两个列表的元素完全一样

True

>>> aList is bList                    #但不是同一个对象

False

>>> id(aList) == id(bList)            #内存地址不一样

False

>>> bList[1] = 8                      #修改其中一个不会影响另一个

>>> bList

[3, 8, 7]

>>> aList

[3, 5, 7]

九🧀. 元组

元组属于不可变序列(元素集合),一旦创建,用任何方法都不可以修改其元素。从形式上,元组的所有元素放在一对圆括号中,元素之间用逗号分隔。

9.1 元组的创建与删除

创建 使用“=”将一个元组赋值给变量

例如:

>>>x = (1,2,3)                               #直接把元组赋值给一个变量

>>>x

(1,2,3)

创建只有一个元素的元组

x =(3)
print(type(x))
x =(3,)
print(type(x))

输出

<class 'int'>
<class 'tuple'>

创建空元组的方法

>>>x = ()                    #空元组

>>>x

()

>>>x = tuple()               #空元组

>>>x

()

使用tuple函数将其他序列转换为元组

>>>tuple(range(5))                   

(0,1,2,3,4)

>>> tuple('abcdefg')                          #把字符串转换为元组

('a', 'b', 'c', 'd', 'e', 'f', 'g')

>>> aList

[-1, -4, 6, 7.5, -2.3, 9, -11]

>>> tuple(aList)                                #把列表转换为元组

(-1, -4, 6, 7.5, -2.3, 9, -11)

删除 使用del可以删除元组对象,不能删除元组中的元素

9.2元组与列表的区别
  • 元组中的数据一旦定义就不允许更改。
  • 元组没有append()、extend()和insert()等方法,无法向元组中添加元素。
  • 元组没有remove()或pop()方法,也无法对元组元素进行del操作,不能从元组中删除元素。
  • 从效果上看,tuple( )冻结列表,而list( )融化元组。
9.3 元组的优点
  • 元组的速度比列表更快。
  • 元组对不需要改变的数据进行“写保护”将使得代码更加安全。
  • 元组可用作字典键(特别是包含字符串、数值和其它元组这样的不可变数据的元组)。元组有时还作为函数的返回值返回(返回多个值)。

十🥧.其他专栏

❤️《Python基础从0到1》专栏
🧡《Python进阶从0到1》专栏
💛《Python爬虫》专栏
💚《Python数据处理》专栏

在这里插入图片描述

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值