4

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

 1 year ago
source link: https://blog.51cto.com/u_15807450/5765249
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Python基础学习之列表操作

Table of Contents

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,两个变量其实是共享一个内存地址的,所以当其中任何一个方法变化,另一个也会发生变化;图解如下:

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

所以,这里并没有任何的复制发生!

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)    # 输出:['后羿', '库里', '路易吉', ['猎人', '法师', '牧师'], '马里奥']

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

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK