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

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

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

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

Q&A

解決済

3回答

5453閲覧

python3 ネストされた辞書から値を取り出す

walk_craftsman

総合スコア7

Python 3.x

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

0グッド

1クリップ

投稿2018/01/19 02:28

編集2018/01/19 02:52

辞書型の配列のネストができないかやってみたんですが、
以下のコードで作ることはできたのですが、キーと値を取り出せませんでした。
具体的は最後のprint文で
dict_values([<zip object at 0x00000285C744B248>, ・・・
と出力されて、zipオブジェクトからキーと値を取り出すことができません。

どうやったら値を取り出せるでしょうか?

※以下の“コード:”は掛け算の2x2から9x9までのネストされた辞書型の配列を生成させるために書きました。汚いコードで申し訳ありません。
for文以下、空行までインデントがあると考えてください。for文が続いてる箇所はネストされます。そして続く空行でインデントがすべて解除されます。
変数の値を確認するためにprint文を入れています。

コメントで指摘いただいたとおり、コード部分を修正しました。

“出力:”では実行結果をコピペしました。

よろしくお願いします。

コード:

prime_key = [] tmp_sec_key = [] pair = [] tmp_value = [] tmp = [] order_list = {} prime_key[:] = list(range(2, 10)) for i in prime_key: tmp_sec_key.append(list(prime_key)) for j in prime_key: tmp.append(i * j) n = 0 m = len(prime_key) for i in prime_key: tmp_value.append(tmp[n:m]) n += len(prime_key) m += len(prime_key) n = 0 for i in tmp_sec_key: tmp_list = {} tmp_list = zip(tmp_sec_key[n], tmp_value[n]) print(dict(tmp_list)) pair.append(tmp_list) n += 1 print("*printed list of dict, 'pair' values.\n") for i in prime_key: order_list.update({i: pair[i -2]}) print(dict(order_list)) print("*printed keys & values of dict 'order_list'.\n") print(order_list.values()) print("*wish, but can't print keys & values of dict 'order_list.values()'.")

出力:
{2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
{2: 6, 3: 9, 4: 12, 5: 15, 6: 18, 7: 21, 8: 24, 9: 27}
{2: 8, 3: 12, 4: 16, 5: 20, 6: 24, 7: 28, 8: 32, 9: 36}
{2: 10, 3: 15, 4: 20, 5: 25, 6: 30, 7: 35, 8: 40, 9: 45}
{2: 12, 3: 18, 4: 24, 5: 30, 6: 36, 7: 42, 8: 48, 9: 54}
{2: 14, 3: 21, 4: 28, 5: 35, 6: 42, 7: 49, 8: 56, 9: 63}
{2: 16, 3: 24, 4: 32, 5: 40, 6: 48, 7: 56, 8: 64, 9: 72}
{2: 18, 3: 27, 4: 36, 5: 45, 6: 54, 7: 63, 8: 72, 9: 81}
*printed values of list 'pair'.

{2: <zip object at 0x00000285C744B248>, 3: <zip object at 0x00000285C7446DC8>, 4: <zip object at 0x00000285C7446F48>, 5: <zip object at 0x00000285C7446F08>, 6: <zip object at 0x00000285C7446C08>, 7: <zip object at 0x00000285C7446E48>, 8: <zip object at 0x00000285C7488748>, 9: <zip object at 0x00000285C7488708>}
*printed keys & values of dict 'order_list'.

dict_values([<zip object at 0x00000285C744B248>, <zip object at 0x00000285C7446DC8>, <zip object at 0x00000285C7446F48>, <zip object at 0x00000285C7446F08>, <zip object at 0x00000285C7446C08>, <zip object at 0x00000285C7446E48>, <zip object at 0x00000285C7488748>, <zip object at 0x00000285C7488708>])
*wish, but can't print keys & values of dict 'order_list.values()'.

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

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

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

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

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

walk_craftsman

2018/01/19 02:54

ご指摘ありがとうございます。修正しました。
guest

回答3

0

元コードから大きく変わりますけど、要はこういうことがしたいということでしょうか?

python

1kuku = {i: {j: i*j for j in range(1,10)} for i in range(1,10)} 2 3for i,dic in kuku.items(): 4 for j,res in dic.items(): 5 print('{}x{} = {}'.format(i,j,res))

実行結果

plain

11x1 = 1 21x2 = 2 31x3 = 3 41x4 = 4 51x5 = 5 61x6 = 6 71x7 = 7 81x8 = 8 91x9 = 9 102x1 = 2 112x2 = 4 122x3 = 6 132x4 = 8 142x5 = 10 152x6 = 12 162x7 = 14 172x8 = 16 182x9 = 18 193x1 = 3 203x2 = 6 213x3 = 9 223x4 = 12 233x5 = 15 243x6 = 18 253x7 = 21 263x8 = 24 273x9 = 27 284x1 = 4 294x2 = 8 304x3 = 12 314x4 = 16 324x5 = 20 334x6 = 24 344x7 = 28 354x8 = 32 364x9 = 36 375x1 = 5 385x2 = 10 395x3 = 15 405x4 = 20 415x5 = 25 425x6 = 30 435x7 = 35 445x8 = 40 455x9 = 45 466x1 = 6 476x2 = 12 486x3 = 18 496x4 = 24 506x5 = 30 516x6 = 36 526x7 = 42 536x8 = 48 546x9 = 54 557x1 = 7 567x2 = 14 577x3 = 21 587x4 = 28 597x5 = 35 607x6 = 42 617x7 = 49 627x8 = 56 637x9 = 63 648x1 = 8 658x2 = 16 668x3 = 24 678x4 = 32 688x5 = 40 698x6 = 48 708x7 = 56 718x8 = 64 728x9 = 72 739x1 = 9 749x2 = 18 759x3 = 27 769x4 = 36 779x5 = 45 789x6 = 54 799x7 = 63 809x8 = 72 819x9 = 81

投稿2018/01/19 02:51

namnium1125

総合スコア2043

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

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

walk_craftsman

2018/01/19 02:56

もうしわけありませんが、掛け算の式と結果がほしいわけではなくて、あくまでもネストされた辞書からデータを取り出すことができないか知りたいのです。 言葉足らずですみません。
namnium1125

2018/01/19 03:27 編集

無事解決したならば何よりです。 ただ私のコードもネストされた辞書からデータを取り出しているように見えますけどね。
walk_craftsman

2018/01/19 03:34

ごめんなさい。あまりにも僕のコードにくらべて圧縮されていたために誤解してしまいました。 今後はよく検討の上返信します。
namnium1125

2018/01/19 03:40

私もwalk_craftsman様のコードをよく読んでいなかったのでお互い様です(^ ^; エラーの解決法を知りたいのに圧縮されたコードを返されても、困惑するのは当然ですよね。申し訳ありませんでしたm(_ _)m
guest

0

ベストアンサー

こういうこと……?

python

1prime_key = [] 2tmp_sec_key = [] 3pair = [] 4tmp_value = [] 5tmp = [] 6order_list = {} 7prime_key[:] = list(range(2, 10)) 8 9 10for i in prime_key: 11 tmp_sec_key.append(list(prime_key)) 12 for j in prime_key: 13 tmp.append(i * j) 14 15 16n = 0 17m = len(prime_key) 18for i in prime_key: 19 tmp_value.append(tmp[n:m]) 20 n += len(prime_key) 21 m += len(prime_key) 22 23 24n = 0 25for i in tmp_sec_key: 26 tmp_list = {} 27 tmp_list = dict(zip(tmp_sec_key[n], tmp_value[n])) 28 print(dict(tmp_list)) 29 pair.append(tmp_list) 30 n += 1 31 32print("*printed list of dict, 'pair' values.\n") 33 34for i in prime_key: 35 order_list.update({i: pair[i -2]}) 36 37 38print(dict(order_list)) 39print("*printed keys & values of dict 'order_list'.\n") 40print(order_list.values()) 41print("*wish, but can't print keys & values of dict 'order_list.values()'.")

結果

{2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18} {2: 6, 3: 9, 4: 12, 5: 15, 6: 18, 7: 21, 8: 24, 9: 27} {2: 8, 3: 12, 4: 16, 5: 20, 6: 24, 7: 28, 8: 32, 9: 36} {2: 10, 3: 15, 4: 20, 5: 25, 6: 30, 7: 35, 8: 40, 9: 45} {2: 12, 3: 18, 4: 24, 5: 30, 6: 36, 7: 42, 8: 48, 9: 54} {2: 14, 3: 21, 4: 28, 5: 35, 6: 42, 7: 49, 8: 56, 9: 63} {2: 16, 3: 24, 4: 32, 5: 40, 6: 48, 7: 56, 8: 64, 9: 72} {2: 18, 3: 27, 4: 36, 5: 45, 6: 54, 7: 63, 8: 72, 9: 81} *printed list of dict, 'pair' values. {2: {2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}, 3: {2: 6, 3: 9, 4: 12, 5: 15, 6: 18, 7: 21, 8: 24, 9: 27}, 4: {2: 8, 3: 12, 4: 16, 5: 20, 6: 24, 7: 28, 8: 32, 9: 36}, 5: {2: 10, 3: 15, 4: 20, 5: 25, 6: 30, 7: 35, 8: 40, 9: 45}, 6: {2: 12, 3: 18, 4: 24, 5: 30, 6: 36, 7: 42, 8: 48, 9: 54}, 7: {2: 14, 3: 21, 4: 28, 5: 35, 6: 42, 7: 49, 8: 56, 9: 63}, 8: {2: 16, 3: 24, 4: 32, 5: 40, 6: 48, 7: 56, 8: 64, 9: 72}, 9: {2: 18, 3: 27, 4: 36, 5: 45, 6: 54, 7: 63, 8: 72, 9: 81}} *printed keys & values of dict 'order_list'. dict_values([{2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}, {2: 6, 3: 9, 4: 12, 5: 15, 6: 18, 7: 21, 8: 24, 9: 27}, {2: 8, 3: 12, 4: 16, 5: 20, 6: 24, 7: 28, 8: 32, 9: 36}, {2: 10, 3: 15, 4: 20, 5: 25, 6: 30, 7: 35, 8: 40, 9: 45}, {2: 12, 3: 18, 4: 24, 5: 30, 6: 36, 7: 42, 8: 48, 9: 54}, {2: 14, 3: 21, 4: 28, 5: 35, 6: 42, 7: 49, 8: 56, 9: 63}, {2: 16, 3: 24, 4: 32, 5: 40, 6: 48, 7: 56, 8: 64, 9: 72}, {2: 18, 3: 27, 4: 36, 5: 45, 6: 54, 7: 63, 8: 72, 9: 81}]) *wish, but can't print keys & values of dict 'order_list.values()'.

tmp_list = zip(tmp_sec_key[n], tmp_value[n])tmp_list = dict(zip(tmp_sec_key[n], tmp_value[n])) にしただけですが。
zip関数の返り値はイテレータであって辞書ではないですよ。

つまり、ネストされた辞書を作ったつもりがそうなっていなかったというだけかと思います。


(ついでに)

欲しかったのはこういう辞書?

python

1order_list = {i: {j: i * j for j in range(2, 10)} for i in range(2, 10)} 2 3{2: {2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}, 4 3: {2: 6, 3: 9, 4: 12, 5: 15, 6: 18, 7: 21, 8: 24, 9: 27}, 5 4: {2: 8, 3: 12, 4: 16, 5: 20, 6: 24, 7: 28, 8: 32, 9: 36}, 6 5: {2: 10, 3: 15, 4: 20, 5: 25, 6: 30, 7: 35, 8: 40, 9: 45}, 7 6: {2: 12, 3: 18, 4: 24, 5: 30, 6: 36, 7: 42, 8: 48, 9: 54}, 8 7: {2: 14, 3: 21, 4: 28, 5: 35, 6: 42, 7: 49, 8: 56, 9: 63}, 9 8: {2: 16, 3: 24, 4: 32, 5: 40, 6: 48, 7: 56, 8: 64, 9: 72}, 10 9: {2: 18, 3: 27, 4: 36, 5: 45, 6: 54, 7: 63, 8: 72, 9: 81}}

投稿2018/01/19 03:02

編集2018/01/19 03:15
quickquip

総合スコア11038

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

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

walk_craftsman

2018/01/19 03:16

まさしくそれです。 zipの返り値からは取り出せないんですね。 ありがとうございます。
guest

0

詳細動作は確認できていませんが
tmp_list = zip(tmp_sec_key[n], tmp_value[n])
tmp_list = dict(zip(tmp_sec_key[n], tmp_value[n]))とし
tmp_listの時点で辞書にしてあげるとよいでしょう。

また

※以下の“コード:”は掛け算の2x2から9x9までのネストされた辞書型の配列を生成させるために書きました。

であればorder_list

Python

1order_list = [] 2for i in prime_key: 3 order_list.append({i: pair[i -2]})

のほうがふさわしいと思います。

投稿2018/01/19 02:58

can110

総合スコア38262

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

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

walk_craftsman

2018/01/19 03:16

ありがとうございます。できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問