本次的題目網址
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
因此我的最後作法如下
如果沒有這個值,會回傳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這個內容,後面則是判斷式
其實也就是我答案的精簡版本
用這類方法寫有幾個優點
- 程式撰寫簡潔,上手後易懂
- Python對這類的寫法有做過優化,會比原本的程式碼執行效率還要更高
效率更快的原因是:用append的方法會找出幾個值就動作幾次,而用list comprehension的方式會先收集好全部應該要放進新list的內容,再一併放進去
(參注:http://stackoverflow.com/questions/16341775/what-is-the-advantage-of-a-list-comprehension-over-a-for-loop
因此還是要熟練此類的撰寫方式,讓程式能夠更簡潔易懂、效率提升。
沒有留言:
張貼留言