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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

Q&A

解決済

3回答

1588閲覧

Python forループで JSON オブジェクトの値を結合したい

SMGLA

総合スコア3

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

0グッド

0クリップ

投稿2021/11/05 11:54

前提:実現したいこと

非エンジニア、Python初心者です。
こちらへの投稿も初めてですので、質問の仕方等不備があればご指摘いただけるとありがたいです。

Pythonで、JSONオブジェクト内の漢字と読みの情報を個別に取り出して操作しようとしています。

JSON

1#test_data.json 2[{"kanji": "阿", "yomi": "あ お"}, 3 {"kanji": "哀", "yomi": "あい あわ.れ かな.しい"}, 4 {"kanji": "愛", "yomi": "あい いと.しい め.でる まな"}]

スペース区切りの読みを個別に取り出し、それぞれに該当する漢字を割り振ってスペース区切りで1行ずつのデータに書き出したいです。

希望する出力結果:
阿 あ
阿 お
哀 あい
哀 あわ.れ
︙(省略)
愛 まな

発生している問題

読みデータを個別に取り出すことはできたのですが、漢字を頭につけようとするとすべての読みを読み込むまで次の漢字を取得してくれません。

実際の出力結果:
阿 あ
阿 お
阿 あい
阿 あわ.れ
︙(省略)
愛 あ
愛 お
愛 あい
愛 あわ.れ
︙(省略)

該当のソースコード

Python

1import json 2 3json_open = open('test_data.json', 'r') 4json_load = json.load(json_open) 5 6for kanji_list in json_load: 7 kanji = kanji_list['kanji'] 8 9 for yomi_list in json_load: 10 yomi = yomi_list['yomi'] 11 12 for yomi_item in yomi.split(): 13 print(kanji + " " + yomi_item)

試したこと

読みの内容をリスト化して長さを取得し、その回数だけ kanji_list をループさせるのだろうなというところまでは考えが及んだのですが、漢字ごとの読みのリスト化がうまくできませんでした。

補足情報(FW/ツールのバージョンなど)

Mac OS 11.6
Google colaboratory 上で作業しています。
Python 3.7.12
BeautifulSoup4 4.6.3
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

json.load() には object_pairs_hook というキーワードが用意されていますので、それを使って以下の様に書く事もできます。

python

1with open('test_data.json') as f: 2 json.load(f, 3 object_pairs_hook = lambda t: 4 print('\n'.join(f'{t[0][1]} {i}' for i in t[1][1].split(' ')))) 5 6# 7阿 あ 8阿 お 9哀 あい 10哀 あわ.11哀 かな.しい 12愛 あい 13愛 いと.しい 14愛 め.でる 15愛 まな

投稿2021/11/05 14:42

melian

総合スコア19874

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

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

SMGLA

2021/11/11 23:14

ご返答をありがとうございます。確認が遅れ申し訳ありませんでした。 object_pairs_hookについて不勉強でしたので確認してみます。 勉強になります、ありがとうございました。
guest

0

とりま、こんな感じかと〜

python

1import json 2from collections import defaultdict 3 4dic = defaultdict(list) 5 6with open('test_data.json') as f: 7 for entry in json.load(f): 8 for yomi in entry['yomi'].split(): 9 dic[yomi].append(entry['kanji']) 10 11for yomi, kanji_list in sorted(dic.items()): 12 for kanji in kanji_list: 13 print(kanji, yomi) 14

出力結果:

阿 あ

哀 あい
愛 あい
哀 あわ.れ
愛 いと.しい
阿 お
哀 かな.しい
愛 まな
愛 め.でる

???? サンプル

追記

質問を読み違えてました。出力結果を、読みの五十音順にする必要はなかったのですね。ですので、can110さんのご回答でよろしいかと思います。

投稿2021/11/05 12:27

編集2021/11/05 12:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SMGLA

2021/11/05 13:44

defaultdict で五十音順に並べ替えることができるのですね。大変勉強になりました。ありがとうございました。
guest

0

ベストアンサー

JSONオブジェクトを読み解くと、以下のように書けることが分かります。

Python

1import json 2 3s = '''[{"kanji": "阿", "yomi": "あ お"}, 4 {"kanji": "哀", "yomi": "あい あわ.れ かな.しい"}, 5 {"kanji": "愛", "yomi": "あい いと.しい め.でる まな"}]''' 6json_load = json.loads(s) 7 8for kanji_list in json_load: 9 kanji = kanji_list['kanji'] 10 for yomi_item in kanji_list['yomi'].split(): 11 print(kanji + " " + yomi_item)

投稿2021/11/05 12:26

can110

総合スコア38278

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

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

SMGLA

2021/11/05 13:43

こんなにシンプルなことだったのですね。助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問