2017年4月19日 星期三

Python - 從list中刪除不重複值 和 list comprehension


本次的題目網址

https://py.checkio.org/mission/non-unique-elements/


這題必須要撰寫出一個function,傳入一個list後,刪除裡面不重複的時並回傳
進而刪除不重複值

例如題目中範例所出的傳入傳出後的結果
[1,2,3,1,3]=[1,3,1,3]
[1,2,3,4,5] = []





想法是用Python的list方法 count 方法來實作
list.count(obj)
後面 丟進去欲知到數量的值(obj),則會回傳此list總共有多少這個數值
如果沒有這個值,會回傳0
並不會error

有了這個方法
核心就是 list.count != 1 
假如值不等於1 就保留放進新的list

因此我的最後作法如下

def nonunique(data):
    ret = []
    for i in data:
        if data.count(i) != 1:
            ret.append(i) 

    print (ret)
    return ret

這題目是最簡單的一題
但此題一開始我卡了一陣子
原因在於我一開始想直接刪除不重複得值
但這在跑迴圈時會引發動態刪除造成答案錯誤

再跑迴圈直接刪除list的內容是非常不好的寫法
但相較之下我最後的答案勢必得在系統多開一個空間存新list
和同學討論下來,這應該是比較可行的做法

另外
Python有個特點是list comprehension  (真不知道中文怎麼翻譯)
可以簡化這類的程式撰寫方式

def nonunique(data):
 return [i for i in data if data.count(i) > 1]

前面和後面的 [ ] 代表開一個新的list
要放進去i這個內容,後面則是判斷式
其實也就是我答案的精簡版本

用這類方法寫有幾個優點

  1. 程式撰寫簡潔,上手後易懂
  2. Python對這類的寫法有做過優化,會比原本的程式碼執行效率還要更高


效率更快的原因是:用append的方法會找出幾個值就動作幾次,而用list comprehension的方式會先收集好全部應該要放進新list的內容,再一併放進去

(參注:http://stackoverflow.com/questions/16341775/what-is-the-advantage-of-a-list-comprehension-over-a-for-loop

因此還是要熟練此類的撰寫方式,讓程式能夠更簡潔易懂、效率提升。

沒有留言:

張貼留言