每日面试之列表去重

列表去重

去重,打乱顺序

#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'

posted @ 2018-05-29 19:41  木夂口  阅读(94)  评论(0)    收藏  举报
levels of contents