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

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

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

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

Q&A

解決済

3回答

1888閲覧

Python:defの中のdelの扱い方について

TeRa_130

総合スコア61

Python

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

0グッド

1クリップ

投稿2019/05/23 03:49

編集2019/05/23 06:46

defの中のdelの扱い方について

pythonを使用しています。
defで定義した関数の中のdelの扱い方がわからないです。
下記のように書いています。

python

1a = [[1,2,3],[2,4,6],[1,3,5],[1,4,9]] 2 3#data…リスト、num…参照したい数字 4def A(data, num): 5 li = [] 6 for i in range(len(data)): 7 if data[i][0] == num: 8 li.append(data[i]) 9 10 for i in range(len(li)): 11 del li[i][0] 12 return li

何度も回すうちにreturnで得られる結果が、
カラのリストになっていってしまって困っています。

追記

. どんなふうに関数Aを呼び出したか

python

1In[1]: 2A(a,1) 3 4In[2]: 5A(a,1)

・どんな実行結果になったか
一回目は、想定していた結果が得られたのですが、
二回目以降は、一回目と同じ結果が得られません。

python

1Out[1]: 2[[2, 3], [3, 5], [4,9]] 3 4Out[2]: 5[]

・どのような結果を期待していたか
何回繰り返しても同じ結果が得られることが望ましいです。

python

1Out[1]: 2[[2, 3], [3, 5], [4,9]] 3 4Out[2]: 5[[2, 3], [3, 5], [4,9]]

・どんな原因があると現時点で推測しているか
「del」の使い方や仕様がわかっていないのですが、
二回目以降の処理にかかわっているのだと思います。

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

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

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

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

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

LouiS0616

2019/05/23 04:02 編集

具体性が全く足りません。 ・どんなふうに関数Aを呼び出したか ・どんな実行結果になったか (何度も回すうちに…は不適。何回回して、どのように実行結果が変化して、空になったのか。そもそも何を何度も回したのか。) ・どのような結果を期待していたか ・どんな原因があると現時点で推測しているか
guest

回答3

0

ベストアンサー

何回繰り返しても同じ結果が得られることが望ましいです。

なるほど。

関数Aを一回呼び出した後、試しにprint(a)してみて下さい。
関数内の操作がもろに影響していることが観察できる筈です。

引数dataを直接操作しないで下さい。呼び出し元に操作が波及します。


解消するための方針は、主に二つあります。
0. 引数dataをコピーして、それを編集する方法
0. 要素を消していくのでは無く、残したい要素を選んでいく方法

現状のコードを活かしたいなら、前者の方法が便利です。

Python

1def A(data, num): 2 ret = [row[:] for row in data] # dataをコピー 3 4 ... 5 ... retを操作していく 6 ... 7 8 return ret

修正: シャローコピーでは対応できないことに後で気付いた。

より理解を深めるため、後者の方法もトライしてみることをお勧めします。

投稿2019/05/23 06:55

編集2019/05/23 07:11
LouiS0616

総合スコア35660

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

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

TeRa_130

2019/05/23 08:04

ご回答ありがとうございます。 「2.要素を消していくのでは無く、残したい要素を選んでいく方法」 で試したところ成功しました。
guest

0

ex01.py

python3

1def task(data, num): 2 return [x[1::] for x in data if len(x) > 0 and x[0] == num] 3 4a = [ 5 [1, 2, 3], [2, 4, 6], [1, 3, 5], [1, 4, 9], 6 [1], [2], [] 7] 8print(task(a, 1)) 9print(task(a, 1))

実行例
イメージ説明

投稿2019/05/24 20:46

katoy

総合スコア22324

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

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

0

もう一度、ゼロから、よく考えながら作り直すのがよいと思います。

現状では、プログラムと、

リストから特定の値だけをリストから特定の値だけを削除したいです。

が合っていません。

投稿2019/05/23 05:06

otn

総合スコア84499

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問