Python Checkio

今天偶爾從一個師兄那裏看到了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"

我首先想到的是用hash之類的判斷重複的方法,後來想畢竟是python應該有好多現成的方法,我想到了list.count()(L.count(value) -> integer -- return number of occurrences of value in L.),鑑於前段時間剛和同學討論了python的奇葩小特性中的列表解析。我寫出瞭如下的代碼:

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
總之,聽好玩的。這裏只是寫一個例子,推薦給大家。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章