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

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

ただいまの
回答率

90.51%

  • Python 3.x

    6450questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 989

辞書型の配列のネストができないかやってみたんですが、
以下のコードで作ることはできたのですが、キーと値を取り出せませんでした。
具体的は最後の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()'.

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2018/01/19 11:40

    コードやログは ``` で囲って下さい。インデントも保持されます。 https://teratail.com/help#about-markdown

    キャンセル

  • walk_craftsman

    2018/01/19 11:54

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

    キャンセル

回答 3

+1

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

kuku = {i: {j: i*j for j in range(1,10)} for i in range(1,10)}

for i,dic in kuku.items():
    for j,res in dic.items():
        print('{}x{} = {}'.format(i,j,res))

実行結果

1x1 = 1
1x2 = 2
1x3 = 3
1x4 = 4
1x5 = 5
1x6 = 6
1x7 = 7
1x8 = 8
1x9 = 9
2x1 = 2
2x2 = 4
2x3 = 6
2x4 = 8
2x5 = 10
2x6 = 12
2x7 = 14
2x8 = 16
2x9 = 18
3x1 = 3
3x2 = 6
3x3 = 9
3x4 = 12
3x5 = 15
3x6 = 18
3x7 = 21
3x8 = 24
3x9 = 27
4x1 = 4
4x2 = 8
4x3 = 12
4x4 = 16
4x5 = 20
4x6 = 24
4x7 = 28
4x8 = 32
4x9 = 36
5x1 = 5
5x2 = 10
5x3 = 15
5x4 = 20
5x5 = 25
5x6 = 30
5x7 = 35
5x8 = 40
5x9 = 45
6x1 = 6
6x2 = 12
6x3 = 18
6x4 = 24
6x5 = 30
6x6 = 36
6x7 = 42
6x8 = 48
6x9 = 54
7x1 = 7
7x2 = 14
7x3 = 21
7x4 = 28
7x5 = 35
7x6 = 42
7x7 = 49
7x8 = 56
7x9 = 63
8x1 = 8
8x2 = 16
8x3 = 24
8x4 = 32
8x5 = 40
8x6 = 48
8x7 = 56
8x8 = 64
8x9 = 72
9x1 = 9
9x2 = 18
9x3 = 27
9x4 = 36
9x5 = 45
9x6 = 54
9x7 = 63
9x8 = 72
9x9 = 81

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/19 11:56

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

    言葉足らずですみません。

    キャンセル

  • 2018/01/19 12:26 編集

    無事解決したならば何よりです。

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

    キャンセル

  • 2018/01/19 12:34

    ごめんなさい。あまりにも僕のコードにくらべて圧縮されていたために誤解してしまいました。

    今後はよく検討の上返信します。

    キャンセル

  • 2018/01/19 12:40

    私もwalk_craftsman様のコードをよく読んでいなかったのでお互い様です(^ ^;

    エラーの解決法を知りたいのに圧縮されたコードを返されても、困惑するのは当然ですよね。申し訳ありませんでしたm(_ _)m

    キャンセル

checkベストアンサー

0

こういうこと……?

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 = dict(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 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関数の返り値はイテレータであって辞書ではないですよ。

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


(ついでに)

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

order_list =  {i: {j: i * j for j in range(2, 10)}  for i in range(2, 10)}

{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}}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/19 12:16

    まさしくそれです。
    zipの返り値からは取り出せないんですね。

    ありがとうございます。

    キャンセル

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/19 12:16

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    6450questions

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