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

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

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

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

Python

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

Q&A

解決済

4回答

522閲覧

Pythonで、元の配列を変化させずに要素削除した新しい配列を作る方法はありますか?

tsugumi907

総合スコア5

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/02/16 14:07

Python(プログラミング全般)初心者です。
ある配列S(S= [3,6,9,9,12])を求めた後、Sから要素を前から順番に一つだけ除いた配列を作りたいと思い、こう書いてみました。
==========
for i in range(len(S)):
T = S
T.pop(i) #del T[i]でも同じ結果
print(T)
==========
本当はこんな(↓)出力が欲しかったのですが
[6, 9, 9, 12]
[3, 9, 9, 12]
[3, 6, 9, 12]
[3, 6, 9, 12]
[3, 6, 9, 9]
実際はこんな(↓)エラーが出ました。
[6, 9, 9, 12]
[6, 9, 12]
[6, 9]
T.pop(i)
IndexError: pop index out of range
試してみると、T.pop(i)(またはdel T[i])をすると、なぜか元の配列Sの要素まで同じように削除されているようです。これを回避するには、3行目の「T=S」を「T= [3,6,9,9,12]」に置き換えれば良いのですが、今回の配列Sは別のスクリプトで求めたてきたので、それをループの中で毎回求めさせるのは非効率な気がします。そこで質問ですが、
1)なぜ「T.pop()」や「del T[]」でSまで変わってしまうのでしょうか?
2)Sを変化させずに、要素削除された新しい配列Tを作る方法はありますか?
Pythonを始めたばかりで基本がわかっていないと自覚しています。ご教示いただけたら幸いです。よろしくお願いします。

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

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

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

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

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

guest

回答4

0

2)Sを変化させずに、要素削除された新しい配列Tを作る方法はありますか?

python

1S = [3,6,9,9,12] 2T = [S[:i]+S[i+1:] for i in range(len(S))] 3 4from pprint import pprint 5pprint(T, width=20) 6 7# 8[[6, 9, 9, 12], 9 [3, 9, 9, 12], 10 [3, 6, 9, 12], 11 [3, 6, 9, 12], 12 [3, 6, 9, 9]]

投稿2022/02/16 14:28

melian

総合スコア21196

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

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

tsugumi907

2022/02/16 14:59

ご回答、ありがとうございました。期待通りに動きました。こういう発想もあるのかと、自分の修行の足りなさを痛感しました。あと、内包表記もまだ使いこなせてなくて、こちらも参考になりました。今後ともよろしくお願いします。
guest

0

ベストアンサー

T = Sだと、TSの指すリストオブジェクトを指すようになります。
つまり1つのオブジェクトに2つの変数名が付いた状態です。
参考:なぜ list 'y' を変更すると list 'x' も変更されるのですか? — Python 3.10.0b2 ドキュメント

案1:Sのコピーを作ってTに代入

Python

1for i in range(len(S)): 2 T = S[:] 3 T.pop(i) 4 print(T)

案2:i番目を避けてその前後を連結

Python

1for i in range(len(S)): 2 T = S[:i]+S[i+1:] 3 print(T)

投稿2022/02/16 14:24

otn

総合スコア86316

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

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

tsugumi907

2022/02/16 14:47

大変分かりやすいご説明、ありがとうございました。案1、2とも期待通り動きました。 リストでは、[:]によって、新しい配列を作るのですね。「参照する」という概念がわかっていませんでした。質問してみてよかったです。貴重なお時間をありがとうございました。
guest

0

内包表記を使って書いてみました。
p1.py

python3

1data = [10, 11, 12, 13, 14] 2 3# 2 番目を削除したリストを得る 4data_2 = [data[i] for i in range(len(data)) if i != 2] 5print(data_2) 6print(data) # data は変化していない 7 8print() 9 10data_subs = [[data[i] for i in range(len(data)) if i != e] for e in range(len(data))] 11print(data_subs)

実行例
イメージ説明

投稿2022/02/18 23:39

katoy

総合スコア22328

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

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

0

大変分かりやすいご説明、ありがとうございました。案1、2とも期待通り動きました。
リストでは、[:]によって、新しい配列を作るのですね。「参照する」という概念がわかっていませんでした。質問してみてよかったです。貴重なお時間をありがとうございました。

投稿2022/02/16 14:42

tsugumi907

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問