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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

278閲覧

python(3.7)の配列に要素を追加する

kurata-yuhei

総合スコア7

Python 3.x

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/01/02 13:51

編集2019/01/02 13:56

前提・実現したいこと

pythonで辞書型を配列に追加していきたいです.その中で辞書型の["test1"]の部分だけ連番を振りたいです.以下の問題につてご教授ください.

発生している問題・エラーメッセージ

[{'test1': 0, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, {'test1': 1, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, {'test1': 2, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, {'test1': 3, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, {'test1': 4, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}]

上記のような辞書型を格納した配列を作成したいのですが以下の該当のソースコードを実行すると以下の配列が生成されます.

[{'test1': 4, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, {'test1': 4, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, {'test1': 4, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, {'test1': 4, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, {'test1': 4, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}]

辞書型の["test1"]が変動せずにrange(5)の最後の値である4に固定されたものが作成されます.

該当のソースコード

python3.7

1agent = {} 2agent_list = [] 3for i in range(5): 4 agent["test1"] = i 5 agent["test2"] = 2 6 agent["test3"] = 3 7 agent["test4"] = 4 8 agent["test5"] = 5 9 agent_list.append(agent) 10 11print(agent_list)

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

同じオブジェクトを使いまわしているのが問題です。
次のようにループ内でagentを生成すれば良いかと。

Python

1agent_list = [] 2 3for i in range(5): 4 agent = {} 5 agent["test1"] = i 6 agent["test2"] = 2 7 agent["test3"] = 3 8 agent["test4"] = 4 9 agent["test5"] = 5 10 agent_list.append(agent) 11 12print(agent_list)

辞書リテラルを使った方が簡単なのですが。

Python

1agent_list = [] 2 3for i in range(5): 4 agent_list.append({ 5 'test1': i, 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5 6 }) 7 8print(agent_list)

投稿2019/01/02 13:59

LouiS0616

総合スコア35660

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

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

kurata-yuhei

2019/01/02 14:17

ありがとうございます.提示いただいた方法は知りませんでした.試してみます.
guest

0

ベストアンサー

python

1agent = {} # ここで辞書オブジェクトのインスタンス生成 2agent_list = [] 3for i in range(5): 4 agent["test1"] = i # 以下全て同じ辞書オブジェクトである 5 agent["test2"] = 2 6 agent["test3"] = 3 7 agent["test4"] = 4 8 agent["test5"] = 5 9 agent_list.append(agent) 10 11print(agent_list) 12 13 14# わかりやすくするために勝手に追加 15from pprint import pprint 16agent_list[0]["test1"] = "hoge" 17pprint(agent_list) 18""" => 19[{'test1': 'hoge', 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, 20 {'test1': 'hoge', 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, 21 {'test1': 'hoge', 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, 22 {'test1': 'hoge', 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}, 23 {'test1': 'hoge', 'test2': 2, 'test3': 3, 'test4': 4, 'test5': 5}] 24"""

対策:ループ内でリストの要素に入れる各辞書ごとに新しいインスタンスを生成する必要があります。

python

1agent_list = [] 2for i in range(5): 3 agent = {} # ここで作るべき 4 agent["test1"] = i 5 agent["test2"] = 2 6 agent["test3"] = 3 7 agent["test4"] = 4 8 agent["test5"] = 5 9 agent_list.append(agent) 10 11print(agent_list)

投稿2019/01/02 13:57

編集2019/01/02 14:00
hayataka2049

総合スコア30933

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

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

kurata-yuhei

2019/01/02 14:16

ありがとうございます.インスタンスをその都度生成していなかったため同じインスタンスが使われて最後で更新されていたのですね.解決いたしました.
guest

0

すでに質問文のコードを修正する方法が回答されていますが、他の書き方をいくつか示します。
ポイントは、

  • dict で "test2": 2 , ... "test5": 5} の変化しない部分を other_dict という変数にしてそれを利用する方法。
  • other_dict 部分を内包表記で生成する方法。

dict の連結、内包表記、map の利用などをいろいろ試してみてください。

ag.py

python3

1other_agent = { 2 "test2": 2, 3 "test3": 3, 4 "test4": 4, 5 "test5": 5 6} 7 8agent_list = [] 9for i in range(5): 10 agent = {"test1": i} 11 agent.update(other_agent) 12 agent_list.append(agent) 13print(agent_list) 14print() 15 16agent_list = [] 17for i in range(5): 18 first_item = {"test1": i} 19 agent_list.append({**first_item, **other_agent}) 20print(agent_list) 21print() 22 23agent_list = [{**{"test1": i}, **other_agent} for i in range(5)] 24print(agent_list) 25print() 26 27agent_list = list(map(lambda x: dict({"test1": x}, **other_agent), range(5))) 28print(agent_list) 29print() 30 31agent_list = [] 32for i in range(5): 33 agent = {"test" + str(x): x if x != 1 else i for x in range(1, 6)} 34 agent_list.append(agent) 35print(agent_list) 36print() 37 38agent_list = [{"test" + str(x): x if x != 1 else i for x in range(1, 6)} for i in range(5)] 39print(agent_list) 40print()

実行例
イメージ説明

投稿2019/01/02 22:47

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問