今天的学习进度:大致看完了《python编程快速上手》第一部分,后三章还没有上机,没有做题,今天的任务完成这些上机。
今天看公众号推送的一道python笔试题:给出一个列表,如何统计重复元素并删除重复元素创建新的列表。
这个题有很多解,而且题目实用性也很强,于是整理了一些前辈的分享和自己的思路,汇总如下:
=================================进入正题=====================================
假设列表为list=[9,9,2,3,2,3,2,3,4,4]
一、删除重复元素有那些方法?
列表遍历、集合无序、字典中键无序
1、用列表遍历的方法:
list=[9,9,2,3,2,3,2,3,4,4]
newlist=[] #空列表
for i in list: #空列表里没有才依次加入,这样加过的就不在这个if条件下了,就不会重复加,也就达到了去重
if i not in newlist:
newlist.append(i)
print(newlist)
2、用集合的方法:
list1=[9,9,2,3,2,3,2,3,4,4]
newlist=list(set(list1))
print(newlist)
3、字典fromkey()
list1=[9,9,2,3,2,3,2,3,4,4]
newdic={}.fromkeys(list1).keys() #这里不太懂为什么这么写???
newlist=list(newdic)
print(newlist)
二、重复元素计数有那些方法?
count和引入counter模块
import collections
countdic=collections.Counter([9,9,2,3,2,3,2,3,4,4]) #注意Counter首字母大写
print(countdic)
(关于counter模块详细解释
http://www.pythoner.com/205.html和https://blog.csdn.net/u013628152/article/details/43198605)
更多方法详见:https://blog.csdn.net/weixin_40604987/article/details/79292493
三、形成代码
1、列表遍历+Counter
list=[9,9,2,3,2,3,2,3,4,4]
newlist=[]
for i in list:
if i not in newlist:
newlist.append(i)
print(newlist)
import collections
countdic=collections.Counter([9,9,2,3,2,3,2,3,4,4])
print(countdic)
2、用set集合+count
list1=[9,9,2,3,2,3,2,3,4,4]
newlist=list(set(list1))
print(newlist)
for i in newlist:
print('%d出现了%d次!'%(i,list1.count(i))) #注意%格式化前后内容中间不加逗号,就是用%间隔,这里容易错
3、fromkey()+count
list1=[9,9,2,3,2,3,2,3,4,4]
newdic={}.fromkeys(list1).keys()
newlist=list(newdic)
print(newlist)
for i in newlist:
print('%d出现了%d次!'%(i,list1.count(i)))
~四、补充排序~
综合以上方法可以发现set+count是又快又好。但是set+count有个缺点,因为集合是无序的,导致会不再遵从原来列表的排序,那么如何使原来的排序保持不变呢?我们补充下排序的知识
https://docs.python.org/3.5/howto/sorting.html
list1=[9,9,2,3,2,3,2,3,4,4]
#newlist=list(set(list1)) #此时列表无序,我们修改为按照原来下标顺序排序的新列表
newlist=sorted(set(list1),key=list1.index)
print(newlist)
for i in newlist:
print('%d出现了%d次!'%(i,list1.count(i)))
或者
list1=[9,9,2,3,2,3,2,3,4,4]
newlist=list(set(list1)) #此时列表无序,我们修改为按照原来下标顺序排序的新列表
newlist.sort(key=list1.index)
print(newlist)
for i in newlist:
print('%d出现了%d次!'%(i,list1.count(i)))