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 是返回一个排列后的列表做为返回值,即原列表不会改变,会返回一个排序后的新列表;python

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 …

能够用这种方法,循环列表中的全部元素;web

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

3.2 for … in enumerate(…)

使用这种方法循环,能够同时得到元素的index(位置信息),举例以下:app

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

4. 列表的复制

4.1 不是复制的复制

首先看如下代码:svg

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

咱们会有一个问题:为何copyheros 的值会变?!?! 这彷佛与咱们的想法不同。缘由以下:
这里:copyheros = heros ,其实并无复制,只是将 copyheros 指向了 heros,两个变量实际上是共享一个内存地址的,因此当其中任何一个方法变化,另外一个也会发生变化;图解以下:
在这里插入图片描述
因此,这里并无任何的复制发生!学习

4.2 浅复制

若是以上的方法没法复制,那么咱们须要怎样才能复制列表呢? 答案是:咱们须要使用copy() 方法;ui

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

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

4.3 深复制

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

例一: 浅复制的例子:xml

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

例二:深复制的例子:blog

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

这里咱们能够获得如下结论:

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