アカウント名:
パスワード:
間違いがふたつ有りますね
1つ目は一行目。正しくは l = "foo bar baz".split(" ") ですね
2つ目は本題で l = "foo foo foo".split(" ") とすれば直ぐに駄目なことが解ります
・「これはやってもいいんだっけ?」という疑問を持つこと自体が「間違い」・「いろんな要素があるリストの特定の要素だけを削除するコード」をお題にするときは「全部の要素が削除対象」というケースを例に挙げる必要がある
貴重なご意見ありがとうございました。
#3899575 [srad.jp]さんの言いたいことが曲解されてるような気がするのでツッコミます。
・「これはやってもいいんだっけ?」という疑問を持つこと自体が「間違い」
ロジック的にバグってるという「間違い」ですよ。
・「いろんな要素があるリストの特定の要素だけを削除するコード」をお題にするときは「全部の要素が削除対象」というケースを例に挙げる必要がある
重要なのは全部fooな事でなく、fooが2連続しているという事です。削除漏れが起きるテストパターンの例示ですね。原理:foo1個目削除→foo元2個目が1個目になる→次のループで、foo元3個目がfoo2個目として渡ってくる。→foo元2個目が削除されずに残る。って事です。
むしろ全てに疑問を持つべきですよね。エクセルじゃだめなんですかとかメモ帳じゃだめなのかそもそもやらなきゃいけないのかレベルから始まり本当にそれでできるのかメモリは足りるか時間は足りるかエトセトラ。
kei100さんは教えるの下手くそなのでツッコみますね
L = [1, 2]del L[0]del L[1]
この話はこれだけで説明できます。リファレンス参照とか関係無い話はやめましょう
ですよねー教えるの下手くそですよね。
リファレンス参照って、Pythonのドキュメント(Forの注釈)を読めって意味だったんですけどね。
ところで、foreach中にコレクションの要素を削除という、.NETなら例外で落ちる所業 [microsoft.com]してるけど、Pythonは例外で死なずに内部カウンタが狂うだけで中途半端に動く&回避策が書いて有るけど関係無いって話なんです?
あなたの最初のコメントは> [:]でコピー作らないと駄目よー> 詳しくはリファレンス参照:2.6 [python.org] 3だけど日本語化されてる。中身は同じ [python.org]です
「コピー作らないと駄目よー」って勘違いしてた訳で、それを誤魔化すのは止めましょうよ
そちらこそ、ちゃんとリンク先の注釈読んでます?
シーケンス全体のスライスを使って一時的なコピーを作ることで避けられます。
ディープコピーしてもよいけど、丸ごとスライスする事で、一時コピーをforに渡してるんですよ?コピーを渡さないと内部カウンタがずれるので、その事込みでロジックを組まないと削除漏れが起きます。# しかも明文化されてない内部仕様に依存するので将来動くかさえ不確実。
その説明で理解できるなら件のコードを書いた時点で気づくと思う。自然言語の説明はやっぱ必要。
目的を達成できるかという点ではすでに出ているようにだめ。Pythonでこういうやり方が良いのかという点でもだめ。Pythonなら判定を"foo bar baz".startswith('f') or ' f' in "foo bar baz"とかにしたほうがPythonぽい
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
駄目 (スコア:0)
間違いがふたつ有りますね
1つ目は一行目。正しくは l = "foo bar baz".split(" ") ですね
2つ目は本題で l = "foo foo foo".split(" ") とすれば直ぐに駄目なことが解ります
Re:駄目 (スコア:1)
・「これはやってもいいんだっけ?」という疑問を持つこと自体が「間違い」
・「いろんな要素があるリストの特定の要素だけを削除するコード」をお題にするときは「全部の要素が削除対象」というケースを例に挙げる必要がある
貴重なご意見ありがとうございました。
Re:駄目 (スコア:1)
#3899575 [srad.jp]さんの言いたいことが曲解されてるような気がするのでツッコミます。
・「これはやってもいいんだっけ?」という疑問を持つこと自体が「間違い」
ロジック的にバグってるという「間違い」ですよ。
・「いろんな要素があるリストの特定の要素だけを削除するコード」をお題にするときは「全部の要素が削除対象」というケースを例に挙げる必要がある
貴重なご意見ありがとうございました。
重要なのは全部fooな事でなく、fooが2連続しているという事です。
削除漏れが起きるテストパターンの例示ですね。
原理:foo1個目削除→foo元2個目が1個目になる→次のループで、foo元3個目がfoo2個目として渡ってくる。→foo元2個目が削除されずに残る。
って事です。
Re: (スコア:0)
むしろ全てに疑問を持つべきですよね。
エクセルじゃだめなんですかとかメモ帳じゃだめなのかそもそもやらなきゃいけないのかレベルから始まり本当にそれでできるのかメモリは足りるか時間は足りるかエトセトラ。
Re: (スコア:0)
kei100さんは教えるの下手くそなのでツッコみますね
L = [1, 2]
del L[0]
del L[1]
この話はこれだけで説明できます。リファレンス参照とか関係無い話はやめましょう
Re:駄目 (スコア:1)
ですよねー
教えるの下手くそですよね。
リファレンス参照って、Pythonのドキュメント(Forの注釈)を読めって意味だったんですけどね。
ところで、foreach中にコレクションの要素を削除という、.NETなら例外で落ちる所業 [microsoft.com]してるけど、
Pythonは例外で死なずに内部カウンタが狂うだけで中途半端に動く&回避策が書いて有るけど関係無いって話なんです?
Re: (スコア:0)
あなたの最初のコメントは
> [:]でコピー作らないと駄目よー
> 詳しくはリファレンス参照:2.6 [python.org] 3だけど日本語化されてる。中身は同じ [python.org]
です
「コピー作らないと駄目よー」って勘違いしてた訳で、それを誤魔化すのは止めましょうよ
Re:駄目 (スコア:1)
そちらこそ、ちゃんとリンク先の注釈読んでます?
シーケンス全体のスライスを使って一時的なコピーを作ることで避けられます。
ディープコピーしてもよいけど、丸ごとスライスする事で、一時コピーをforに渡してるんですよ?
コピーを渡さないと内部カウンタがずれるので、その事込みでロジックを組まないと削除漏れが起きます。
# しかも明文化されてない内部仕様に依存するので将来動くかさえ不確実。
Re: (スコア:0)
その説明で理解できるなら件のコードを書いた時点で気づくと思う。
自然言語の説明はやっぱ必要。
Re: (スコア:0)
目的を達成できるかという点ではすでに出ているようにだめ。
Pythonでこういうやり方が良いのかという点でもだめ。
Pythonなら判定を
"foo bar baz".startswith('f') or ' f' in "foo bar baz"
とかにしたほうがPythonぽい