python列表操作详解_操作列表—Python 学习笔记

遍历列表

所谓遍历列表就是访问一下每一个元素,并且对这个元素做点什么,比如我们想把列表中的每一个元素都打印出来:

animals = ['cat', 'dog', 'pig']

print(animals[0])

print(animals[1])

print(animals[2])

# cat

# dog

# pig

for 循环

如果列表中有一千个元素呢,按照上面这么干的你是不是就哭了,所以我们可以用循环来做,比如 for 循环:

animals = ['cat', 'dog', 'pig']

for animal in animals:

print(animal) #注意这行开头缩进了,代表是循环的一部分

# cat

# dog

# pig

for 循环的格式是:

for 自定义的变量名,用来储存每一项元素 in 列表名: # 别忘记了结尾的冒号,它告诉 Python 下一行是循环的第一行

for 循环是这样工作的:Python 从列表 animals 中取出第一个元素,然后把它赋值给变量 animal,(animal 只是个变量名,你起什么名字都可以)然后执行 print(animal) 就打印出来了第一个元素。以此类推就打印出来所有元素。

当然,除了简单的打印元素本身,你还可以更复杂的操作,比如:

animals = ['cat', 'dog', 'pig']

for animal in animals:

word = animal.title()[0]

print(f'{word}stands for{animal}')

# C stands for cat

# D stands for dog

# P stands for pig

使用 range() 函数

假如你需要打印10以内的所有偶数,该怎么做呢?可以用 for 循环配合 range 函数

range 可以方便的生成一系列数字:

for num in range(2,5):

print(num)

# 2

# 3

# 4

上例通过 range(2,5) 可以拿到2、3、4这三个数,包含开头,不包含结尾。

range(start, stop, step) 接收3个参数,最后一个是间隔,如果不填,默认就是间隔1。那么10以内所有偶数就是:

for num in range(2,11,2):

print(num)

# 2

# 4

# 6

# 8

# 10

range 与 list有很多相似的地方,但其实不一样。

for num in range(0,5):

print(num)

for num in [0, 1, 2, 3, 4]:

print(num)

以上两个 for 循环结果是一样的,但是在 Python3中 range 函数返回的值并不是list:

a = range(0,3)

print(a[1])

# 1

print(a)

# range(0, 3)

我 google 了一通,range 返回的值是“an immutable sequence object of integers depending upon the definitions used”,我的翻译是:根据我们的指令生成的不可修改的整数序列对象。

这个对象像list一样拥有长度、可以用 index 取其中的值,能 slice 等等等,但它就不是list。它的大小是永远一样的,不管你是 range(0,1) 还是 range(0,99),因为它在根据你的要求计算之前,是不会在内存中写一个实际的list的。比如你执行了上例第三行代码a[1],这个时候 a 才计算一下index 为1的那项是什么,然后返回给你,你不提要求,就什么都没有,这样设计的初衷是节省内存。

以上是我查资料后的理解,可能有误。而且鉴于这就是小白的基础入门课呢,我就不深究了,我手上的书上都没讲这么深(⊙﹏⊙)b

但是 range 是可以转化为list的,使用 list() 函数:

a = list(range(0,3))

print(a)

# [0, 1, 2]

列表解析

列表解析是什么,我们先看一个例子,如果要新建一个装1,2,3三个数的list,很简单,直接写:

a = [1, 2, 3]

如果要装1到100之间,每一个数的2次方呢?直接写肯定不行,可以用循环:

a = []

for num in range(1, 101):

a.append(num**2)

列表解析是一种更简洁的生成复杂列表的方式,比如依然是解决上述问题,可以这样:

a = [ num**2 for num in range(1, 101) ]

这一行代码,就实现了和上面循环一样的效果。num**2 是一个表达式,它就是会填到这个list中的值,而后面的 for 循环就是定义这个值到底是什么的。

用 index 拿列表中的一部分

跟字符串类似

a = [1,2,3,4,5]

print(a[1:3])

# [2, 3] 拿到第二第三个元素

如果省略开始索引,那就从头拿;省略结束索引,那就一直拿到最后一个元素:

a = [1,2,3,4,5]

print(a[:3])

# [1, 2, 3]

print(a[2:])

# [3, 4, 5]

负数索引代表从后往前数:

a = [1,2,3,4,5]

print(a[:-3])

# [1,2]

print(a[-2:])

# [4, 5]

如果前后索引都省略呢?

那就是从第一个拿到最后一个,全拿,就相当于完整复制一份:

a = [1,2,3,4,5]

print(a[:])

# [1,2,3,4,5]

什么时候需要复制?

看个案例,假如 a 喜欢 cat 和 dog,b 也喜欢 cat 和 dog,所以直接等于 a,后来 b 又喜欢了 pig 所以加上 pig,但问题来了,a 也被加上 pig 了,因为 a 和 b 指向的是同一个 list:

a = ['cat', 'dog']

b = a

b.append('pig')

print(a, b)

#['cat', 'dog', 'pig'] ['cat', 'dog', 'pig']

使用复制就不会有这个问题:

a = ['cat', 'dog']

b = a[:]

b.append('pig')

print(a, b)

# ['cat', 'dog'] ['cat', 'dog', 'pig']

元组(tuple)

tuple 是什么东西?

先看一个简单的 tuple:

tuple1 = (1, 2, 3)

元组和列表非常像,元组使用括号,而列表使用方括号。当然,最重要的区别是:列表中的元素可以改变,而元组中的元素一旦确定了,就不能改变了。以下是行不通的:

tuple1 = ('a', 'b', 'c')

tuple1[1] = 'w'

# Traceback (most recent call last): 报错喽

# File "test.py", line 2, in 错在第二行

# tuple1[1] = 'w' 这就这句出错啦

# TypeError: 'tuple' object does not support item assignment 错在元组的元素不能修改

元组的好处是什么?

1、有些数据注定是不该被改变的,比如你的生日,把不该变的数据放在元组中更安全。

2、元组应该放那些客观该被改变的东西,用这些东西来表示数据结构,而列表则是表示顺序的。比如你站在街上,想把你的位置坐标存起来,就用一个元组:

point = (42, 33) # 表示由x, y坐标构成结构

如果你想把你走路经过的所有点都存起来,应该用 list:

line = [(42, 17), (43,18), (44, 19)] # 表示数据数量和顺序

3、因为元组不可修改,所以可以作为字典的 key,而列表则不行(如果不懂的话,等后面学字典是什么东西就知道了)

创建元组

注意,元组并不是由括号定义的,而是逗号,除了空元组,其他情况都必须加逗号,哪怕元组中只有一个元素。我们可以用函数 type 来验证,函数 type 能返回对象的类型:

a = ()

print(type(a)) # 是 tuple

b = (1)

print(type(b)) # 不是 tuple 而是数字

c = (1,)

print(type(c)) # 是 tuple

d = (1, 2)

print(type(d)) # 是 tuple

为什么上例中的 b 不是元组,因为括号被当做了算数表达式的运算符来处理。

用 index 拿元组中的一部分

a = (1, 2, 3, 4, 5)

print(a[2]) # 3

print(a[-1]) # 5

print(a[2:4]) # (3, 4)

print(a[-4:3]) # (2, 3)

改变元组

虽然说了不能改元组内的元素,但如果该元素是 mutable 的,则可以改这个元素内部的元素,比如 list:

a = (8,9,[1, 2])

a[2][1] = 4

print(a)

# (8, 9, [1, 4]) 没有报错

这是因为你保存到元组中的是一个列表的引用 , 相当于一个指针,它指向存放这个列表的实际位置。所以当你修改列表内部元素的时候,修改的是那个实际的列表,而这个“指针”不变,所以元组认为它的这个元素也没变。

还可以用加号把两个元组相加,生成一个新元组:

a = (1, 2)

b = (3, 4)

print(a + b)

# (1,2,3,4)

用乘号重复元组:

a = (1, 2)

print(a * 2)

# (1, 2, 1, 2)

你也可以通过重新赋值的方法,改变整个元组:

a = (1, 2)

a = (3, 4)

print(a)

# (3, 4)

删掉元组

虽然不能删掉元组中的元素,但我们可以删掉整个元组:

a = (1, 2)

del a

顺便说一下del,以下这段如果你是纯小白可能不懂,没关系:

del 后面没跟(), 显然不是函数,我查了文档,del 是语句(statement)类似 break、return,但百度出来的好多国内资料都说“del函数”真是坑爹。

遍历元组

依然可以用 for 循环遍历元组:

a = (1, 2, 3)

for item in a:

print(item)

# 1

# 2

# 3

其他元组相关方法和函数

count 方法,查某元素在元组或者列表中出现的次数:

a = (1, 1, 2, 3)

num = a.count(1)

print(num)

# 2

index 方法,查某元素在元组或者列表中,第一次出现的index:

a = (1, 1, 2, 3)

num = a.index(1)

print(num)

# 0

tuple 函数,把列表、字符串等转换成元组:

list1 = [1, 1, 2, 3]

str1 = 'a string'

tuple1 = tuple(list1)

tuple2 = tuple(str1)

print(tuple1, tuple2)

# (1, 1, 2, 3) ('a', ' ', 's', 't', 'r', 'i', 'n', 'g')

max 函数,返回最大元素

tuple1 = (1, 1, 2, 3)

print(max(tuple1))

# 3

还可以指定 key,比如找出长度最长的字符串:

tuple1 = ('b', 'abc', 'dd')

print(max(tuple1, key=len))

# abc

sorted 函数,返回一个排序后列表:

tuple1 = ('e', 'a', 'u', 'o', 'i')

tuple2 = sorted(tuple1)

print(tuple2)

# ['a', 'e', 'i', 'o', 'u']

sum 函数,返回元组或列表中元素的和:

tuple1 = (1, 2, 3)

print(sum(tuple1))

# 6

list1 = [2, 3, -6]

print(sum(list1))

# -1

all 函数,看元组或者列表中元素是否全部为 True

tuple1 = (1, 2, 3)

print(all(tuple1))

# True

tuple2 = (1, 2, False)

print(all(tuple2))

# False

any 函数,看元组或者列表中元素是否至少有一个为 True

tuple2 = (1, 2, False)

print(any(tuple2))

# True

上篇回顾:ZackGuo510:列表简介—Python 学习笔记​zhuanlan.zhihu.com

初学笔记难免有谬误,欢迎您指出,感谢。

欢迎关注我的微信号“我想会编程”,微信号“ZackGuo510”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值