senseIY
@senseIY (I Y)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

空の辞書でfor in ができるのか

解決したいこと

paizaの問題集(python)で分からなかった部分があるので教えていただきたいです。※スキルチェックの問題ではないです。
問題文
1行目に行数を表す整数 n、続く n 行の各行で「文字」と「整数」の組が空白区切りで入力されます。
n 個の組について、「文字」の値が同じ組同士の数値を足しあわせてまとめ、まとめた数値の降順で、文字とまとめた数値の組を出力してください。
この際、まとめた数値は重複しません。

▼ 下記解答欄にコードを記入してみよう

入力される値
入力は以下のフォーマットで与えられます。

n
S_1 D_1
S_2 D_2
...
S_i D_i
...
S_n D_n

S_i は「文字」で、D_i は「整数」です。

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力
文字とまとめた数値の組を各行で出力してください。
文字と数値は半角スペースで区切ってください。

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

・1 ≦ n ≦ 10,000
・-10,000 ≦ D_i ≦ 10,000 (ただし、1 ≦ i ≦ n)
・S_iは1つの半角英文字

入力例1
7
A 1
D 6
C 2
G 4
B 70
A 10
B 5

出力例1
B 75
A 11
D 6
G 4
C 2

入力例2
3
G 0
S 3
E -2

出力例2
S 3
G 0
E -2

入力例3
5
A -2
E 0
W -5
A -1
E -20

出力例3
A -3
W -5
E -20

答えのコード

該当するソースコード


例)

num = int(input())
inputs = {}
result = {}

for i in range(num):
    tmp = input().split()

    exist = False
    for (key, value) in inputs.items():
        if key == tmp[0]:
            exist = True

    if exist:
        inputs[tmp[0]] = inputs[tmp[0]] + int(tmp[1])
    else:
        inputs[tmp[0]] = int(tmp[1])

# ソート用にkeyとvalueを反転させた辞書を作る
for (key, value) in inputs.items():
    result[value] = key

result = sorted(result.items(), reverse=True)

for i in result:
    print(i[1] + " " + str(i[0]))

分からないところ
for (key, value) in inputs.items():の部分がなぜこのコードで動くのか調べてもよく分からないので教えていただきたいです。このコードのinになっているinputs.items()はこの時点では空の要素であり、key,valueには何も入らないため、なぜこのコードが動くのか理解できないです。printをつかっても何も出力されないのでどのように動いているのかよく分かりません。

0

1Answer

空の辞書でも for in は使えます。正確には for (key, value) in inputs.items() で処理しているのは辞書ではなく辞書のキーと値のタプルを返すイテレータです。何にせよ、 for in で処理するコレクションが空なら、繰り返しの文は一度も実行されずに終わります:

for elem in []:
    print "ここは実行されない"

for key in {}:
    print "ここは実行されない"

for (key, value) in {}.items():
    print "ここは実行されない"

余談ですが、辞書が特定のキーを含むかチェックする処理は以下のように簡略化できます:

    exist = False
    for (key, value) in inputs.items():
        if key == tmp[0]:
            exist = True

    exist = tmp[0] in inputs
0Like

Comments

  1. @senseIY

    Questioner

    ようやくコードが理解できました!ずっと理解できずに悩んでいたのでとても助かりました。分かりやすく、丁寧な回答をしていただきありがとうございました。

Your answer might help someone💌