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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

745閲覧

Pythonにおいて、2つの辞書を比較し、先頭一致した場合、新たな辞書に保存する方法

green2021

総合スコア16

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/12/15 06:08

Pythonにおいて、2つの辞書を比較し、先頭一致した場合、新たな辞書に保存する方法を知りたいです。

具体的には、
dict1 = {'2021':'北海道','2020':'沖縄','2019':'京都','2018':'大阪','2017':'東京'}
dict2 = {'20210101':'牛','20210222':'狐','20190505':'鳥','20001231':'犬','19990404':'猫','19202003':'虎'}

上記の2つの辞書があります。
dict1とdict2のkeyをみて、dict1の先頭4文字がdict2の先頭4文字と一致した場合、新たな辞書dict3のkeyにdict1のvalue、dict3のvalueにdict2のvalueを保存するコードを教えていただきたいです。

上記の出力結果だと、
dict3 = {'北海道':'牛','北海道':'狐','京都':'鳥'}のような出力結果になると思います。
{'20001231':'犬','19990404':'猫','19202003':'虎'}の部分はkeyの先頭4文字がdict1のkeyの先頭4文字と一致していないので、dict3には記載されないようになります。
注意点としては、keyの先頭どうしの比較となります。例えば、{'19202003':'虎'}はkeyの先頭は一致していませんが、中身に2020という文字列があるため{'沖縄':'虎'}となる可能性があります。
そのような例は省きたいと考えています。

また、実際に用いる辞書のkeyは10000件を超えるものになります。
Pythonを初めて間もないので、このような形の質問となりますが、ご教授、宜しくお願い致します。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/12/15 06:17

dict3で'北海道'というキーに対して '牛', '狐'という値を持たせようとしていますが、pythonの辞書では同一キーに対して別々の値を持たせることはできません。
green2021

2021/12/15 06:33

迅速な回答ありがとうございます。 また、新たな知識のご教授もありがとうございます。 その場合、新たな辞書dict3に保存するのではなく、csvファイルに新たな形式として保存することはできますか? 上記の例だと、 #data_name.csv prefectures,name 北海道,牛 北海道,狐 京都,鳥 のようになると思います。 また、prefectures,name はヘッダーとなります。 宜しくお願い致します。
guest

回答2

0

  • csvファイルに新たな形式として保存することはできますか?

pandasのDaTaFrameを使って以下のコードで'output.csv'に保存できます。

pythyon

1import pandas as pd 2 3dict1 = {'2021':'北海道','2020':'沖縄','2019':'京都','2018':'大阪','2017':'東京'} 4dict2 = {'20210101':'牛','20210222':'狐','20190505':'鳥','20001231':'犬','19990404':'猫','19202003':'虎'} 5 6df1 = pd.DataFrame(pd.Series(dict1, name='prefectures')) 7df2 = pd.DataFrame(pd.Series(dict2, name='name')) 8df2['year'] = df2.index.str[:4] 9df3 = pd.merge(df1, df2, left_index=True, right_on='year').reset_index(drop=True)[['prefectures','name']] 10print(df3) 11df3.to_csv('output.csv', index=False)

中身は以下です。

python

1>>> print(df3) 2 prefectures name 30 北海道 牛 41 北海道 狐 52 京都 鳥

参考
pandas.DataFrameを結合するmerge, join(列・インデックス基準)
pandasでcsvファイルの書き出し・追記(to_csv)
pandasの文字列メソッドで置換や空白削除などの処理を行う

投稿2021/12/15 07:54

編集2021/12/15 07:59
ppaul

総合スコア24670

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

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

0

ベストアンサー

辞書に変換しようとするとキーが重複してしまうので、dict2のキー先頭4文字とdict1のキーが一致しているものをリストで保持しておくのが良いと思います。
一旦、リストにしてしまえば、pandasやcsvモジュールを使って簡単に.csvファイルを生成できると思います。

python

1import pandas as pd 2 3dict1 = {'2021':'北海道','2020':'沖縄','2019':'京都','2018':'大阪','2017':'東京'} 4dict2 = {'20210101':'牛','20210222':'狐','20190505':'鳥','20001231':'犬','19990404':'猫','19202003':'虎'} 5 6# dict3 = {dict1[k[:4]]: v for k, v in dict2.items() if k[:4] in dict1} 7# print(dict3) # {'北海道': '狐', '京都': '鳥'} 8 9prefectures, names = [], [] 10for k, v in dict2.items(): 11 if k[:4] in dict1: 12 prefectures.append(dict1[k[:4]]) 13 names.append(v) 14 15df = pd.DataFrame({'prefecture': prefectures, 'name': names}) 16res = df.to_csv(index=False) 17print(res) 18# prefecture,name 19# 北海道,牛 20# 北海道,狐 21# 京都,鳥

投稿2021/12/15 06:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問