Python基础学习第二节 列表操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础学习第二节 列表操作相关的知识,希望对你有一定的参考价值。

Python基础学习之列表操作

1. 列表的增,删,改,查

1.1 列表的增加,常用的方法有:append, extent, incert

  1. append() 在列表的最后面增加元素;
heros = [马里奥, 路易斯, 林克]
# 列表的增加 append()
heros.append(后羿)  # 在列表最后追加值
print(heros)    #输出:[马里奥, 路易斯, 林克, 后羿]
  1. insert() 在列表的指定位置增加元素;
# 列表插入
heros.insert(3, 战神)
print(heros)    # 输出:[马里奥, 路易斯, 林克, 战神, 后羿]
  1. extend() 将两个列表合并为一个列表
# 列表合并
heros2 = [屠夫, 虚空]
heros.extend(heros2)
print(heros)    # 输出:[马里奥, 路易斯, 林克, 战神, 后羿, 屠夫, 虚空]

1.2 列表的删除,常用的方法有:pop, clear , remove

  1. pop() 在列表的最后面增加元素;pop() 只可以传入整数的index值,不能传入列表中的元素;
heros= [马里奥, 路易斯, 林克, 战神, 后羿, 屠夫, 虚空]
x = heros.pop()  # 默认删除最后一个数据,并返回被删除的值
print(heros)  # heros中删除了最后的元素,输出为:[马里奥, 路易斯, 林克, 战神, 后羿, 屠夫]
print(x)  # pop 方法返回了被删除的值,这一点很重要,可以对变成带来便利;输出为:虚空
x = heros.pop(3)  # pop() 也可以指定删除的位置,x输出为:战神
  1. clear() 清空列表中的所有元素,但是保留列表名,即:使列表变为空列表,但列表存在;
heros.clear() #清空heros中的所有元素;
print(heros)  # 输出:[]
# del 也可以使用但是不推荐,如果没有写index, 会将变量都删掉,即不再有hores这个列表;
  1. remove() 可以传入列表中的元素
heros.remove(路易斯)
heros.remove(路易斯)   #再次删除,数据不存在,则会报错 ValueError: list.remove(x): x not in list
print(heros)   
  1. del() 可以删除元素(不推荐使用),也可以删除列表变量本身,一般用来删除变量本身
a=[a,b,c]
# 删除元素  不推荐使用这种方法!
del a[1]   #传入元素,则删除对应的元素; 
print(a)   # 输出为:[a, c]

# 删除变量
del a
print(a)    # 变量a 已经被删除,所以这里会报错; error: name a is not defined

1.3 列表的修改,直接对制定元素赋值即可;

  • 对制定元素进行赋值,即可修改列表;
# 列表的修改
heros = [后羿, 屠夫, 路易吉, 马里奥]
heros[1] = 库里
print(heros)   # 输出:[后羿, 库里, 路易吉, 马里奥]

1.4 列表的查询,常用方法有 index, count, in

  1. index() 传入列表的元素,可以返回元素在列表中的位置
heros = [后羿, 库里, 路易吉, 马里奥]
a = heros.index(库里)
print(a)  # 返回元素的位置,输出:1
b = heros.index(林克)   # 列表中没有值,会报错;error: 林克 is not in list
  1. count() 可以查询列表中的某个值的个数
heros = [后羿, 库里, 路易吉,库里, 马里奥]
a = heros.count(库里)
print(a)  # 返回元素的位置,输出:2
  1. in 可以查询某个值是否在列表中
heros = [后羿, 库里, 路易吉,库里, 马里奥]
print(林克 in heros)   # 返回False

2. 列表的排序 (sort, sorted, reverse)

这里需要说明一下 sort & sorted 的区别: sort 是对原列表进行排列,即原列表会改变; sorted 是返回一个排列后的列表作为返回值,即原列表不会改变,会返回一个排序后的新列表;

heros = [后羿, 库里, 路易吉,库里, 马里奥]
heros.sort()
print(heros)     # 输出:[后羿, 库里, 库里, 路易吉, 马里奥]
heros.sort(reverse=True)   # 返序排列
print(heros)     # 输出:[马里奥, 路易吉, 库里, 库里, 后羿]
a = sorted(heros)  # 不会影响原列表,会返回一个排序后的新列表;
print(a)        # 输出:[后羿, 库里, 库里, 路易吉, 马里奥]
print(heros)    # 输出:[马里奥, 路易吉, 库里, 库里, 后羿]
heros.reverse() # 翻转列表,与 heros.sort(reverse=True) 一样

3. 列表的循环 (for ... in ... & for ... in enumerate(...) )

3.1 for ... in ...

可以用这种方法,循环列表中的所有元素;

heros = [后羿, 库里, 路易吉,库里, 马里奥]
for hero in heros:
	print(hero)   # 输出:后羿  库里  路易吉  库里  马里奥 

3.2 for ... in enumerate(...)

使用这种方法循环,可以同时获得元素的index(位置信息),举例如下:

heros = [后羿, 库里, 路易吉,库里, 马里奥]
for id,hero in enumerate(heros):
	print(id ,--,hero)
# 输出如下:
# 0 -- 后羿
# 1 -- 库里
# 2 -- 路易吉
# 3 -- 库里
# 4 -- 马里奥

4. 列表的复制

4.1 不是复制的复制

首先看以下代码:

heros = [后羿, 库里, 路易吉,库里, 马里奥]
copyheros = heros
print(copyheros)     # 输出:[后羿, 库里, 路易吉, 库里, 马里奥]
heros[1] = 宙斯大魔王
print(heros)         # 输出:[后羿, 宙斯大魔王, 路易吉, 库里, 马里奥]
print(copyheros)     # 输出:[后羿, 宙斯大魔王, 路易吉, 库里, 马里奥] 

我们会有一个问题:为什么copyheros 的值会变?!?! 这似乎与我们的想法不一样。原因如下: 这里:copyheros = heros ,其实并没有复制,只是将 copyheros 指向了 heros,两个变量其实是共享一个内存地址的,所以当其中任何一个方法变化,另一个也会发生变化;图解如下: 所以,这里并没有任何的复制发生!

4.2 浅复制

如果以上的方法无法复制,那么我们需要怎样才能复制列表呢? 答案是:我们需要使用copy() 方法;

heros = [后羿, 库里, 路易吉,库里, 马里奥]
copyheros = heros.copy()
print(copyheros)     # 输出:[后羿, 库里, 路易吉, 库里, 马里奥]
heros[1] = 宙斯大魔王
print(heros)     # 输出:[后羿, 宙斯大魔王, 路易吉, 库里, 马里奥]
print(copyheros)     # 输出:[后羿, 库里, 路易吉, 库里, 马里奥]

从上面的例子,我们可以看到,更改heros 的元素后, copyheros 未发生变化;这里的copyheros 就是浅复制; 为什么这样的复制还叫浅复制呢?请继续看~

4.3 深复制

前面讲了浅复制,所谓浅复制,通俗的说:就是只能复制列表中的第一层; 总所周知,列表是可以嵌套的,例如: [后羿, 库里, 路易吉, [ 猎人, 法师, 牧师 ] , 马里奥],这里的列表中,出现了另一个列表[ 猎人, 法师, 牧师], 当出现这种情况时,浅复制无法复制列表中的列表,参考下面的例一;因为:列表中的列表依然只共享一个内存空间; 想要一个完整的复制,需要使用copy模块中的 deepcopy(), 举例如例二:

例一: 浅复制的例子:

heros = [后羿, 库里, 路易吉,[ 猎人, 法师, 牧师 ], 马里奥]
copyheros = heros.copy()
print(copyheros)    # 输出:[后羿, 库里, 路易吉,[ 猎人, 法师, 牧师 ], 马里奥]
heros[3][1] = 变身!!!
print(heros)  # 输出:[后羿, 库里, 路易吉, [猎人, 变身!!!, 牧师], 马里奥]
print(copyheros)   # 输出:[后羿, 库里, 路易吉, [猎人, 变身!!!, 牧师], 马里奥]

例二:深复制的例子:

import copy
heros = [后羿, 库里, 路易吉,[ 猎人, 法师, 牧师 ], 马里奥]
copyheros = copy.deepcopy(heros)
print(copyheros)   # 输出:[后羿, 库里, 路易吉, [猎人, 法师, 牧师], 马里奥]
heros[3][1] = 变身!!!
print(heros)    # 输出:[后羿, 库里, 路易吉, [猎人, 变身!!!, 牧师], 马里奥]
print(copyheros)    # 输出:[后羿, 库里, 路易吉, [猎人, 法师, 牧师], 马里奥]

这里我们可以得到以下结论:

  • 使用 = ,没有建立复制;
  • 浅复制只是建立了一层的复制体;
  • 深复制就是建立了一个完全独立的复制体;

以上是关于Python基础学习第二节 列表操作的主要内容,如果未能解决你的问题,请参考以下文章

Python基础学习第十二节 文件操作

:Python的基本数据类型-第二节:Python中表示“有序”(序列)的数据类型

python 基础

萌新向Python数据分析及数据挖掘 第一章 Python基础 第一节 python安装以及环境搭建 第二节 变量和简单的数据类型

零基础学Python后端开发篇 第二十二节--Python Web开发:HTTP请求的url路由

python学习第二节