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

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

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

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

Python

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

Q&A

解決済

2回答

23245閲覧

Python3 リスト内辞書でキーの値で検索する方法

suvera

総合スコア106

Python 3.x

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

Python

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

1グッド

1クリップ

投稿2016/12/29 06:45

###前提・実現したいこと
下記コードの

peopleListinfoList

peopleList[x]["info"] == infoList[x]["id"]
を探してpeopleList[x]["info"]infoList[x]を格納するということがしたいです。

for内forでぐるぐると回せば出来はするのですが
実行回数も多く、なおかつリストの長さも例ほど少なくないため
できたらもっとスマートにこれを行える方法を取りたいと考えたのですが
方法がわかりませんでした。
方法があればlist.sorted()のような感じできれいにまとめたいです。

片方のループくらいなら気になりません。

###該当のソースコード

python3

1peopleList = [ 2 {"name":"tanaka", "info":5}, 3 {"name":"suzuki", "info":2}, 4 {"name":"watanabe", "info":9}} 5] 6infoList = [ 7 {"id":2, "age":35}, 8 {"id":5, "age":11}, 9 {"id":9, "age":53} 10]

###試したこと

peopleList を info でソートして
infoList を id でソートして
forで回しながら格納していく方法で今はしのいでいます。

###補足情報(言語/FW/ツール等のバージョンなど)
Python3

ness👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

一旦idから引けるdictにするのはどうでしょう。スマートに見えるかどうかはわかりませんが・・。

python3

1peopleList = [ 2 {"name":"tanaka", "info":5}, 3 {"name":"suzuki", "info":2}, 4 {"name":"watanabe", "info":9} 5] 6infoList = [ 7 {"id":2, "age":35}, 8 {"id":5, "age":11}, 9 {"id":9, "age":53} 10] 11 12infoDict = {x['id']: x for x in infoList} 13for people in peopleList: 14 people.update({'info': infoDict[people['info']]}) 15 16print(peopleList) 17# -> [{'info': {'age': 11, 'id': 5}, 'name': 'tanaka'}, {'info': {'age': 35, 'id': 2}, 18# 'name': 'suzuki'}, {'info': {'age': 53, 'id': 9}, 'name': 'watanabe'}]

投稿2016/12/29 08:13

編集2016/12/29 08:17
sharow

総合スコア1149

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

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

suvera

2017/01/12 05:21

おぉぉ!凄い!! できてます!ありがとうございました!!
guest

0

もし,pandasを利用可能であれば,高速に結合できます.

Python

1peopleList = [ 2 {"name":"tanaka", "info":5}, 3 {"name":"suzuki", "info":2}, 4 {"name":"watanabe", "info":9} 5] 6infoList = [ 7 {"id":2, "age":35}, 8 {"id":5, "age":11}, 9 {"id":9, "age":53} 10] 11 12df_people = pd.DataFrame(peopleList) 13df_info = pd.DataFrame(infoList) 14df_merged = pd.merge(df_people, df_info, left_on='info', right_on='id') 15print(df_merged) 16 17>>> 18 info name age id 190 5 tanaka 11 5 201 2 suzuki 35 2 212 9 watanabe 53 9

投稿2016/12/31 14:04

MasatakaMiyoshi

総合スコア109

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

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

suvera

2017/01/12 05:25

pandasなんて便利なものがあったんですね ありがとうございます。 これは使いたいので導入しようと思います。
suvera

2017/01/12 05:49

早速使ってみたんですが df_merged.to_dict()ではカラム毎に辞書型になる形で取得されます。 以下のような形で最終的には扱いたいのですが なにか良い方法ありましたら教えてください。 peopleList = [ {"name":"tanaka", "info":{"id":5, "age":11}}, {"name":"suzuki", "info":{"id":2, "age":35}}, {"name":"watanabe", "info": {"id":9, "age":53}} ]
MasatakaMiyoshi

2017/01/12 06:28 編集

nameをインデックスに指定して (set_index), infoの列を削除して (drop) 行列を転地して (T) から,dict形式にするのはどうでしょう? ``` df_reshaped = df_merged.set_index('name').drop('info', axis=1).T.to_dict() print(df_reshaped) >>> {'suzuki': {'age': 35, 'id': 2}, 'tanaka': {'age': 11, 'id': 5}, 'watanabe': {'age': 53, 'id': 9}} people_list = [{'name': k, 'info': v} for k, v in df_merged.items()] print(people_list) >>> [{'info': {'age': 53, 'id': 9}, 'name': 'watanabe'}, {'info': {'age': 11, 'id': 5}, 'name': 'tanaka'}, {'info': {'age': 35, 'id': 2}, 'name': 'suzuki'}] ``` あるいは,ageとidの情報を含んだinfoという列を作成して, name列とinfo列を取り出して (loc) 行列を転置して (T) 辞書にして (to_dict) 値を取りだす (values) という手もあります↓ ``` info = df_merged.loc[:, ['age', 'id']].T.to_dict() df_merged.loc[:, 'info'] = info.values() print(df_merged) >>> info name age id 0 {'id': 5, 'age': 11} tanaka 11 5 1 {'id': 2, 'age': 35} suzuki 35 2 2 {'id': 9, 'age': 53} watanabe 53 9 people_list = list(df_merged.loc[:, ['name', 'info']].T.to_dict().values()) print(people_list) >>> [{'info': {'age': 11, 'id': 5}, 'name': 'tanaka'}, {'info': {'age': 35, 'id': 2}, 'name': 'suzuki'}, {'info': {'age': 53, 'id': 9}, 'name': 'watanabe'}] ``` この方法でも速度は保証されると思いますが,ちょっと読みづらくなってきますね…最終的に辞書形式にするのであればsharowさんの方法のほうが読む人に優しいと思います. 個人的には,データをpd.DataFrame形式のまま扱える場合のほうが,pandasの利用場面として適切だと思っています.もしそれが可能であればぜひぜひ. 利用例: ``` df_merged.loc[df_merged['name'] == 'tanaka', 'age'] >>> 11 df_merged.loc[df_merged['name'] == 'tanaka', :].iloc[0] >>> info 5 name tanaka age 11 id 5 df_merged.loc[df_merged['name'] == 'tanaka', :].iloc[0].age >>> 11 ```
suvera

2017/01/16 05:44

解答ありがとうございました。 要件による仕様上最終的に辞書型で処理を終えなければならないため今回はこの方法を見送ることにします。 ただ・・・便利ですねぇこれ、別のタスクの際に使ってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問