第101回【Python】辞書の基本、辞書のデータ更新

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

はじめに

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

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

タバコを止めてから、もうかなりの年月が経ちました。こうなると、当時は気づかなかったちょっとした匂いにも敏感になってしまうものです。会社は完全禁煙なのですが、朝出社すると、微かに匂う。どう注意すればいいのか、頭を痛めています。

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

辞書の基本

n 人の人に関して、それぞれの人の名前と財産が与えられます。その後に人名 S が与えられるので (S は最初に与えられた名前のうちのいずれか) 、 S の財産を表す整数を出力してください。

n
s_1 a_1
...
s_n a_n
S

1 行目には正整数nが与えられ、 2 行目から (n + 1) 行目には、人々の名前と財産が “s_i a_i” というフォーマット (s_i は人の名前を表す文字列、 a_i はその人の財産を表す整数、半角スペース区切り)で与えられます。 (n + 2) 行目には人名 S が与えられます (S は 2 行目から (n + 1) 行目にかけて与えられた人名のいずれか)。


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

・1 ≤ n , a_i ≤ 50 (1 ≤ i ≤ n)
・各 s_i (1 ≤ i ≤ n) および S は大小アルファベットからなる長さ 1 以上 10 以下の文字列


入力例

2
Kirishima 1
Kyoko 2
Kirishima

出力例

1

辞書型は便利なので好きです。

Python
N = int(input())
dic = {}
for _ in range(N):
    s,a = input().split()
    dic[s] = a
print(dic[input()])
VBA
N = Cells(1, 1)
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To N
    SA = Split(Cells(i + 1, 1), " ")
    If Not dic.exists(SA(0)) Then
        dic.Add SA(0), SA(1)
    End If
Next
S = Cells(N + 2, 1)
Debug.Print dic(S)

辞書のデータ更新

n 人の人の名前 s_1, …, s_n が与えられたのち、 m 回の「攻撃」に関する情報が与えられます。各行は “p_i a_i” というフォーマットで与えられ、 p_i はダメージを受けた人の名前 (s_1, …, s_n のいずれか) 、 a_i は p_i が受けたダメージ数を表す数です。

最後に人名 S が与えられるので (S は s_1, …, s_n のいずれか) 、 S が受けたダメージの合計を出力してください。なお、一度もダメージを受けていない人の合計ダメージは 0 とします。

n
s_1
...
s_n
m
p_1 a_1
...
p_m a_m
S

1 行目には正整数 n が与えられ、 2 行目から (n + 1) 行目には人の名前 s_1, …, s_n が改行区切りで与えられます。 (n + 2) 行目には正整数 m が与えられ、 (n + 3) 行目から (n + m + 2) 行目には人の名前 p_i (s_1, …, s_n のいずれか) とその人が受けたダメージ a_i が “p_i a_i" という半角スペース区切りのフォーマットで m 行与えられます。 (n + m + 3) 行目には s_1, …, s_n の中のいずれかの人名 S が与えられます。


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

・1 ≤ n, a_i ≤ 50 (1 ≤ i ≤ n)
・各 s_i (1 ≤ i ≤ n) は大小アルファベットからなる長さ 1 以上 10 以下の文字列で、互いに全て異なる


入力例

2
Kirishima
Kyoko
2
Kyoko 1
Kyoko 2
Kyoko

出力例

3

なんかちょっとだけロープレ風な問題。面白くて好きかもしれない。

Python
N = int(input())
dic = { input():0 for _ in range(N) }
M = int(input())
for _ in range(M):
    p,a = input().split()
    dic[p] += int(a)
print(dic[input()])
VBA
N = Cells(1, 1)
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To N
    dic.Add Cells(i + 1, 1), 0
Next
M = Cells(N + 2, 1)
For i = 1 To M
    PA = Split(Cells(i + N + M, 1), " ")
    dic(PA(0)) = dic(PA(0)) + Val(PA(1))
Next
S = Cells(N + M + 3, 1)
Debug.Print dic(S)

最後に

Python と VBA とやっていることは同じなんだけれど、Python の可読性は高いなぁと思う。VBA はちょっと立ち止まって考えないとすぐに理解するのは難しい。

VBA では、いつも与えられた数字でどのセルからデータを取得するか一生懸命計算して考えるのだけれど、カウントアップする変数でも用意して、それでセルの行を管理させれば楽かもしれないと、今更ながら感じた。代入演算子が使えないので、書くのがちょっと面倒かもしれない。

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

Python学習,Python,paiza

Posted by LeoSaki