今天偶爾從一個師兄那裏看到了checkio,感覺很好玩。
我看到的第一個題是要求寫一個函數,接收一個數組,然後返回其中的重複元素,而且元素的順序不能發生變化。換句話說,就是去掉其中不含重複的元素。比如:
checkio([1,2,3,1,3])==[1,3,1,3],"1st example"
checkio([1,2,3,4,5])==[], "2nd example"
checkio([5,5,5,5,5])==[5,5,5,5,5],"3rd example"
checkio([10,9,10,10,9,8])==[10,9,10,10,9],"4th example"
def checkio(data):
return [e for e in data if data.count(e) > 1]
看了下上面最火的答案是這樣的,只有一行:
checkio=lambda d:[x for x in d if d.count(x)>1]
傳說中效率最高的答案是這樣的:
def checkio(data):
from collections import Counter
nonunique = Counter(data) - Counter(set(data))
return [x for x in data if x in nonunique]
上面用了collections中的一個Count()方法,生成一個Count對象,其中存儲着數組轉化成的一個字典,字典的key是數組元素,字典的value是元素在數組中出現的次數,而且兩個Count對象相減的時候,會將對應key的value值相減,然後去掉其中value非正的鍵值對。上面的set方法的作用是Build an unordered collection of unique elements. 這樣,就不難理解上面的代碼了。
下面是一個求列表元素的中位數的題目,我的代碼如下:
def checkio(data):
l = len(data)
s = sorted(data)
if l % 2 == 0:
return (s[l/2]+s[l/2-1])/2.0
else:
return s[l/2]
上面比較火的代碼巧妙的利用python中列表可以從後往前索引取值的特性,寫出瞭如下代碼:
def checkio(data):
off = len(data) / 2
data.sort()
med = data[off] + data[-(off + 1)]
return med / 2.0
總之,聽好玩的。這裏只是寫一個例子,推薦給大家。