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

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

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

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

Python

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

Q&A

解決済

2回答

1304閲覧

listの値を変更し別のリストへappendする方法

puromin

総合スコア13

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2020/03/26 14:14

編集2020/03/26 15:28

前提・実現したいこと

バージョン:python3
実行環境:VScode

以下のようなリストがあります。

output = ["A会場", "東京", "03-***-****,090-***-****"]

この場合に連絡先が複数存在する場合、ほかの会場名や住所は同じまま連絡先の分だけ同じリストを作成したいです。
連絡先が複数の場合は、連絡先ごとに","で区切られています。
そのため、splitで分割し、それぞれの値に変更しながら別で保存しようとしてコードを作成しています。

outputs = [["A会場", "東京", "03-***-****"], ["A会場", "東京", "090-***-****"]]

このような形を目指しています。

発生している問題

値の変更がうまくできず、ただ同じものが複製されるだけとなっています。
具体的には、

outputs = [["A会場", "東京", "090-***-****"], ["A会場", "東京", "090-***-****"]]

といった感じになってしまっています。

該当のソースコード

python

1list_output = [] #outputを入れるためのリスト 2output = ["A会場", "東京", "03-***-****,090-***-****"] 3 4#電話番号複数対策 5list_tell = output[2].split(",") 6#複数の場合で分岐 7if len(list_tell) > 1: 8 for tell in list_tell: 9 output[2] = tell 10 11 list_output.append(output) 12else: 13 list_output.append(output)

試したこと

print文を使用しどこで値が変わっているのかは確かめました。
for内で、一回目のループ時は、

outputs = [["A会場", "東京", "03-***-****"]]

となっており、値が変更されて入っているのを確認しています。
しかし、最後は同じものが複製されてしまっています。
変更後にappendし、変更の影響を受けないと考えているため何が原因なのかわかりません。
入れる際の変数が同じだからなのでしょうか?

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

元となるoutputは複数存在し、それもforループで同じような処理を行い、outputsにまとめその後また違う処理を加えます。

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

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

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

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

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

meg_

2020/03/26 15:26

「output[1] = tell」は"東京"を変更していますが良いのでしょうか?
puromin

2020/03/26 15:29

おっしゃる通りです。 正しくはoutput[2]です。 ご指摘ありがとうございます。
guest

回答2

0

エラーになりますよ。
実行していないコードを載せるのは止めましょう。

appendは、引数のコピーを追加するのじゃなくて、引数のオブジェクトを追加します。
追加したのは、2回とも同じオブジェクトなので、同じものが2回表示されます。

list_output.append(output[:])のように、オブジェクトのコピーを追加するようにします。

投稿2020/03/26 14:37

otn

総合スコア84507

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

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

puromin

2020/03/26 15:30

list_outputが定義されていないからエラーになるということでしょうか? その点は自分の記載ミスです。すみませんでした。
puromin

2020/03/26 15:31

ご指摘いただいたもので一度調べて試してみます。
guest

0

ベストアンサー

output = ["A会場", "東京", "03-***-****,090-***-****"] #電話番号複数対策 list_tell = output[2].split(",") #複数の場合で分岐 if len(list_tell) > 1: list_output = [[*output[:2], tel] for tel in list_tell] else: list_output = output print(list_output)

投稿2020/03/26 18:46

編集2020/03/26 18:51
shiracamus

総合スコア5406

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

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

puromin

2020/03/28 00:30

ご回答いただきありがとうございます! 実際のコードも記載してありとても分かりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問