Homeの1問目(Non-unique Elements)

ブログも毎日更新のつもりだったのですが、
早速ながらサボるという残念極まりないことをしでかしてしまいました。
ただ、pythonの勉強の方はきちんと続けています。
といっても、CheckiOの課題を順を追ってやってるだけですし、
非常にスローペースなんですがしばらくはこれを続けようかなと思っています。

ということで、CheckiOの自分の回答コードをひたすら晒していきます。
最終版じゃない過程も晒していくので匿名でも無駄に恥ずかしいです。

py.checkio.org

リストの中から重複している(ユニークでない)数字だけを取り出すという問題ですね。
とりあえず、配列内の数字を一つづつ取り出して総当てして重複した場合、別の配列に突っ込んでいくという感じで解いてみました。

var 1 :
for文がうまく書けなかったのでwhileを使うというとても残念な感じです。

def checkio(data):
    arr=
    i = 0
    while i < len(data[:]):
        n = 0
        t = 0
        while n < len(data[:]):
            if data[i] == data[n]:
                t = t+1
                if(t > 1):
                    arr.append(data[n])
                    break
            n = n+1
        i = i + 1

return arr

var 2 :
for文がfor..in..しかないと分かったんでwhileを使っていたところをforで書き直してみました。
ifが二重になっているのを省きたい気がしますね。

def checkio(data):
    arr=
        for i in data:
            t = 0
            for n in data:
                if i == n:
                    t = t + 1
                    if t > 1:
                        arr.append(n)
                        break

return arr

 

var 3 :
ifの重複はなんともできなかったのですがrangeを使って変な変数を削りました。

def checkio(data):
    arr=
    for i in range(len(data)):
        for n in range(len(data)):
            if i != n:
                if data[i] == data[n] :
                    arr.append(data[n])
                    break

return arr

 

var 4 :
回答のところに

#You can use list.count(element) method for counting.
#Create new list with non-unique elements
#Loop over original list

って書いてありましたね。。。
countを使うとlist内のエレメント数をカウントできると。
ちゃんと読まないとダメですね。

def checkio(data):
    arr =
    for i in data:
        if data.count(i) > 1:
            arr.append(i)
return arr

ということで、自分としてはこれくらいでいいかなと思ったのですが、
他者の回答を見るとまさかの1行。

checkio=lambda d:[x for x in d if d.count(x)>1]

なるほどなぁ。。。
lambdaっていうのは無名関数なんですね。
jsでいうと、
checkio=function()
みたいな感じですかね。

とりあえず引き続き頑張ります。