【Python】列表重复元素删除(附python打包教程)
1 删除空元素
python中删除元素有时会出现一些意外状况,比如删除空元素:
for i in a:
if i=='' :
a.remove(i)
或者类似的一些版本:
for index,i in enumerate(a):
if len(a[index])==0:
a.remove(a[index])
对于空元素不相邻的情况是可以很好的工作的,但是对于空元素相邻的情况就会出现问题,例如对于:
a=['','a','','b','','','','']
执行第一段代码,结果如下:
a= ['a', 'b', '', '']
我们换一种方式,令:
a=['a','abc','b','abc','c','d','e','f']
执行代码:
for index,i in enumerate(a):
if len(a[index])<3:
a.remove(a[index])
结果:
a=['abc', 'abc', 'd', 'f']
根据这个结果很容易猜测出,在循环的时候如果一个元素删除,那么之后的元素的索引都会减少1,而在下一次循环的时候index会增加1,这么一来就有一个夹在中间的元素被忽略掉了,那么很自然的我们会将代码改成下面的样子:
for index,i in enumerate(a):
if len(a[index])<3:
a.remove(a[index])
index=index-1
不幸的是,结果并没有改变:
a=['abc', 'abc', 'd', 'f']
个人猜测在其他代码中,比如java,这么做应该是有用的(没有尝试),但是在python中这么做是不可以的,在查阅了一些资料后发现,如果只是删除空格那么可以用如下表达:
b=[x for x in a if x!='']
这么做确实非常简洁,至少在删除指定字符的时候是一个不错的选择。然后针对索引的问题可以采用倒序的方式:
a=['','a','','b','','','','']
for i in range(len(a)-1,0,-1):
if a[i]=='':
a.remove(a[i])
结果还是比较好的:
a=['a', 'b']
2 删除列表中的重复值
那么在实际中除了删除空格有时候还需要删除指定元素,如果根据一开始的思路,代码应该是:
for i in a:
if a.count(i)>1:
a.remove(i)
同样,对于相邻的需要删除的值,仍然是有上面的问题的,这时候就要用一些其他的手段了:
- set()
b=sorted(set(a),key=a.index)
采用这种方式,可以将a中重复元素去掉,同时顺序是按照元素在a中出现的顺序:
a=['f','abc','c','abc','c','a','b','a']
b=['f', 'abc', 'c', 'a', 'b']
- {}.fromkeys().keys()
b={}.fromkeys(a).keys()
结果:
a=['f','abc','c','abc','c','a','b','a']
b=dict_keys(['f', 'abc', 'c', 'a', 'b'])
- set()+sort()
b=list(set(a))
b.sort(key=a.index)
和方法一基本相同
- 迭代
b=[]
for i in a:
if not i in b:
b.append(i)
结果和一相同,更为朴素的一种做法
- 排序后手动比较相邻元素
def sortlist(a):
a.sort()
last=a[-1]
for i in range(len(a)-2,-1,-1):
if a[i]==last:
a.remove(a[i])
else:
last=a[i]
return a
和第一部分的最后一段代码想法是类似的,关键在于要先排序。
3 python的打包
安装
方法一:
直接通过pip安装
pip install pyinstaller
方法二:
从github上下载源码,然后进入解压包目录,打开命令行:
python setup.py install
打包
对于需要打包的.py文件,直接在所处位置打开命令行:
pyinstaller -F a.py
随后在当前目录的dist文件夹中就可找到打包后的可执行程序。
Ref
https://www.cnblogs.com/nzyjlr/p/4174145.html
https://blog.csdn.net/mrlevo520/article/details/51840217