第156回【Python】重複の判定、配列(リスト)の重複カウント

現在取り組んでいるのは、paiza ラーニング問題集「B ランクレベルアップメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 156 回目です。

昼は作業しながら終わらせることが多いです。LunaSaki(嫁)が作ってくれる弁当なので、ゆっくり味わって食べたいものです。今のところ、急遽出勤となった日以外は 100 % お弁当を作ってくれています。感謝。

それでは、今日も頑張ってみようと思います。

今回取り組む内容について

以下は、前回までに取り組んだ問題とまったく同じなので、飛ばします。
コードは数書いてナンボとかカッコつけたこと書いてましたが、あまりにも多いので挫折しました。

STEP: 1 インクリメント
STEP: 5 数字のみの出力
STEP: 6 昇順ソート出力

重複の判定 (paizaランク D 相当)

指定された配列(リスト)の定義の中で、同じ値が存在した場合はtrueを、そうでない場合はfalseを出力してください。

なし

HND, NRT, KIX, NGO, NGO
を要素に持つ配列(リスト)をプログラムで定義し、使用すること。


期待する出力

配列(リスト)の要素に重複があればtrueを、重複がなかったらfalseを出力する。
最後は改行し、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

なし


入力例

なし

出力例

なし

重複の判定はかなりいろいろと使われる気がする。

Python
li = ['HND', 'NRT', 'KIX', 'NGO', 'NGO']

for i in range(len(li)):
    for j in range(i+1,len(li)):
        if li[i] == li[j]:
            print('true')
            break
    else:
        continue
    break
else:
    print('false')

フラグ管理無しのパターン。Python はこの書き方が綺麗で好きです。

VBA
Sub sort_add_1()

    li = Array("HND", "NRT", "KIX", "NGO", "NGO")
    
    Do
        For i = LBound(li) To UBound(li)
            For j = i + 1 To UBound(li)
            
                If li(i) = li(j) Then
                    Debug.Print "true"
                    Exit Do
                End If
                
            Next
        Next
        
        Debug.Print "false"
        
    Loop While False
    
End Sub

フラグ管理無しパターン。VBA は、分かりづらいとの指摘を頂くことが多いですが、この書き方が好き。

配列(リスト)の重複カウント (paizaランク D 相当)

指定された配列(リスト)の定義の中で、同じ要素の数をカウントして、その数を出力してください。

なし

“HND", “NRT", “KIX", “NGO", “NGO", “NGO", “NGO", “NGO"
を要素に持つ配列(リスト)をプログラムで定義し、使用すること。
ただし、2つ以上同じ要素が出現するのは、1種類の文字列についてだけです。


期待する出力

同じ要素の数をカウントして、その数を出力してください。
最後は改行し、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

なし


入力例

なし

出力例

なし

あるなしの判定でなく、幾つあるかをカウントする。「2つ以上同じ要素が出現するのは、1種類の文字列についてだけです」とのことなので、何かしらやりようがある気がする。

Python
li = ['HND', 'NRT', 'KIX', 'NGO', 'NGO', 'NGO', 'NGO', 'NGO']
ans = 1

for i in range(len(li)):
    for j in range(i+1,len(li)):
        if li[i] == li[j]:
            ans += 1
    if ans > 1:
        break

print(ans)
Python(別解)
li = ['HND', 'NRT', 'KIX', 'NGO', 'NGO', 'NGO', 'NGO', 'NGO']
dic = {}

for c in li:
    if c not in dic:
        dic[c] = li.count(c)

for k,v in dic.items():
    if v > 1:
        print(v)
        break
VBA
Sub sort_add_2()

    li = Array("HND", "NRT", "KIX", "NGO", "NGO", "NGO", "NGO", "NGO")
    
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    For i = LBound(li) To UBound(li)
        s = li(i)
        If dic.exists(s) Then
            dic(s) = dic(s) + 1
        Else
            dic.Add s, 1
        End If
    Next
    
    For Each v In dic
        If dic(v) > 1 Then
            Debug.Print dic(v)
            Exit For
        End If
    Next
    
End Sub

最後に

重複の判定や重複のカウントはよく利用するパターンだと思います。そして、その時にあったやり方がまだまだあると思います。ちょっと条件が違えば、また別の効率的な方法を探すのも面白いですし。

paiza が出してくれている模範解答とは異なっていることが多いです。出来るだけ自分が書いたコードで何度かテストを行ったうえで間違いないことを確認してからアップしているのですが、何かミスがありましたらご指摘いただけますと幸いです。

引き続き、よろしくお願いいたします!

Pythonpaiza,学習,Python

Posted by LeoSaki