每日面试之列表去重
列表去重
去重,打乱顺序
#set集合方法
l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))
#利用字典key值不能重复特性
l1 = ['b','c','d','b','c','a','a']
l2 = {}.fromkeys(l1).keys()
去重,顺序不变
#用list类的sort方法
l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))
l2.sort(key=l1.index)
#内置函数sorted
l1 = ['b','c','d','b','c','a','a']
l2 = sorted(set(l1),key=l1.index)
#for循环遍历
l1 = ['b','c','d','b','c','a','a']
l2 = []
for i in l1:
if not i in l2:
l2.append(i)
#三元表达式+列表推导式
l1 = ['b','c','d','b','c','a','a']
l2 = []
[l2.append(i) for i in l1 if not i in l2]
打乱有序列表
radom.shuffle(list)
函数参数是列表(可变类型)时,参数值在内存中是可变的
def e_list(v,li=[]):
li.append(v)
return li
l1=e_list(10)
l2=e_list(123,[])
l3=e_list('a')
print(l1) [10.‘a’]
print(l2) [123]
print(l3) [10,'a']
注意:print的顺序,先执行l1,l2,l3,后执行print
列表的直接赋值,切片,深浅拷贝
列表中有copy()方法--复制一个相同的列表,先来看一段代码
names = ["小明", "小红", "小黑", "小黄", "小白"]
# 把 names 复制,赋值给 names2 变量
names2 = names.copy()
# 分别输出 names names2
print(names)
print(names2)
结果是一样的,现在,我们修改names列表,来看代码
names = ["小明", "小红", "小黑", "小黄", "小白"]
# 把 names 复制,赋值给 names2 变量
names2 = names.copy()
#修改names列表中的‘小黄’
names[3]="yellow"
# 分别输出 names names2
print(names)
print(names2)
结果是,names列表中的修改成功,names2没有变,原理是什么呢?
首先,names指向一个列表,然后names复制了一份,赋值给了names2,所以修改names,第二个列表不受影响。
----
再看一个例子
names = ["小明", "小红", ["张三", "李四", "王五"], "小黑", "小黄", "小白"]
# 复制一份列表
names2 = names.copy()
# 把李四 改成英文
names[2][1] = "Lisi"
print(names)
print(names2)
运行结果是两个列表的李四都变成了英文,看图
中间的列表单独分配了一块空间,第一层裂变中去引用地址,复制的names2也是引用的地址,所以内存中的值变了,两个列表内部列表的值也变了。
也就是说 list.copy()方法只能copy一层,这就是所谓的浅复制
浅复制的三种方法
import copy
names = ["小明", "小红", "小黑", "小黄", "小白"]
# 浅copy 1.
names1 = copy.copy(names)
# 2.
names2 = names[:]
# 3. 工厂函数
names3 = list(names)
深复制
import copy
names = ["小明", "小红", "小黑", ["粉色"], "小黄", "小白"]
# 深复制
deep_names = copy.deepcopy(names)
# 修改粉色为 Pink
names[3][0] = "Pink"
# 分别打印输出两个列表
print(names)
print(deep_names)
列表的copy,其实是对元素的引用
单层列表--直接赋值会随着修改改变,切片和copy不会
为什么直接赋值会改变?
python名称空间存放的名字和内存地址的对应关系,直接赋值相当于同一个内存地址对应两个名字
l1 = ['a','b','df','as']
l2 = l1
l2=l1.copy()
l2=l1[:]
l1[0]='d'
print(l1,l2)
列表嵌套--修改内部列表的值,赋值,copy,切片都会改变,为什么?
只是修改来内部列表在内存中的值,对于外部列表来说,内存中的值并没有改变
l1 = [['a',3213],'b','df','as']
l2 = l1
# l2=l1.copy()
# l2 = l1[:]
l1[0][0]='aaaaaaaaa'