質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2248閲覧

Python3 辞書内の同一keyがあった場合 購入費管理

python3_beginer

総合スコア46

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

2クリップ

投稿2018/04/24 07:31

皆さまいつもお世話になっております。

あるグループ内での社員それぞれの昼食で食べた定食メニューの管理をしたいです。

・1 行目に グループの人数 N が整数で与えられます。

・2 行目に、半角英小文字で構成される文字列が N 個スペース区切りで与えられます。それぞれの文字列は、グループの人の名前です。

・3 行目に、社員たちが昼食で食べた、定食の合計の数 が整数 M で与えられます。

・4 行目から続く M 行には、購入した人の名前を表す半角英小文字で構成される文字列 と

 彼らが食べた定食の価格 がこの順にスペース区切りで与えられます。

・入力は合計で M + 3 行となり、入力値最終行の末尾に改行が1つ入ります。

・全ての社員に対して、定食購入費が同一である別の社員は存在しない

入力例1
2
ando noda
2
noda 1000
ando 500

出力例1
noda
ando

入力例2
3
A B C
4
A 1000
B 1000
B 2000
C 2000

出力例2
B
C
A

コード n = int(input()) name_lst = list(map(str,input().split())) m = int(input()) data = [list(map(str,input().split())) for _ in range(m)] dic = {} for name, amount in data: dic[name] = int(amount) dic_trans = sorted(dic, key=lambda x:x[1], reverse=True) for x in dic_trans: print(x)

#質問

入力例2 だと、同じ人物が二回別の価格の定食を購入している。
これを辞書で表示すると以下のようになる

dic = {A:1000, B:1000, B:2000, C:2000}

Bを一つにまとめて、辞書を作りなおしたいのですが、方法がわかりません。

アドバイス等頂きたいです。宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

dic = {A:1000, B:1000, B:2000, C:2000}

同じキーだと上書きされるので、こうはなりません。

python

1>>> d = {} 2>>> d["A"] = 1000 3>>> d["B"] = 1000 4>>> d["B"] = 2000 5>>> d["C"] = 2000 6>>> d 7{'C': 2000, 'A': 1000, 'B': 2000}

ほら、ならない。

けっきょく合計額だけほしいならLouiS0616さんの回答のように加算していくのも手ですが、正攻法で同じキーに複数の値を持たせようとすると、listが値の辞書を作って、appendしていくのが一つの手です。

defaultdictを使ってやると簡単にできます。

python

1from collections import defaultdict 2 3n = int(input()) 4users = input().split() 5 6m = int(input()) 7 8d = defaultdict(list) 9for _ in range(m): 10 k, v = input().split() 11 d[k].append(int(v)) 12 13for k,v in sorted([(k, sum(v)) for k,v in d.items()], 14 key=lambda x:x[1], reverse=True): 15 print(k)

投稿2018/04/24 08:51

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python3_beginer

2018/04/26 02:49

返信遅れて申し訳ありません。 いろんな方法の辞書の作成があるんですね。 教えて頂きありがとうございます。 何度も書いて復習します。 ご指導ありがとうございました。
guest

0

前以てメンバーのリストが分かっているならば、バリューが0の辞書を作っておけば良いかと。

Python

1lunch_dict = {name: 0 for name in name_lst}

そうすれば、あとはデータを読み込んで各要素に足すだけです。

Python

1data = [input().split() for _ in range(m)] 2for datum in data: 3 name, amount = datum 4 lunch_dict[name] += int(amount)

投稿2018/04/24 07:45

編集2018/04/24 07:46
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python3_beginer

2018/04/26 02:49

返信遅れて申し訳ありません。 辞書の作成方法を理解していませんでした。 教えて頂きありがとうございます。 これからは辞書の知識を駆使して、スマートにコードを書いていきたいです。 ご指導ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問