リストから偶数を削除する関数 (xs=[1,2,3,4,5,6] など) を作成し、残りのリストを返します。助けが必要です。ありがとうございます: remove sort などの組み込み関数は使用できませんが、delete ステートメントのみを使用できます。
3 に答える
残りのリストを返す必要があるため、削除するのではなく、代わりにフィルタリングする必要があります。
[v for v in xs if v % 2 == 1]
これにより、すべての奇数のリストが作成されます。
>>> xs = [1, 2, 3, 4, 5, 6]
>>> [v for v in xs if v % 2 == 1]
[1, 3, 5]
明らかな方法は機能しません:
for index, value in enumerate(xs):
if not value % 2:
del xs[index]
または、さらに悪いことに、この特定のケースでうまくいくのは、あなたが非常に幸運だったからです (そして、あなたの先生はあなたがこの罠に陥ることを期待しているかもしれません)。
なんで?まあ、あなたがdel i[0]
、それは他のすべてを下にシフトします。次にチェックするi[1]
と、それはオリジナルi[1]
ではなく、オリジナルi[2]
です。元のi[1]
!
for
これは、 .*のドキュメントの大きな灰色のメモで説明されています。
これに対する最善の解決策は、Martijn Pieters が言うように、そもそも削除しないことです。
元のリストを変更することを気にしない場合 (他のオブジェクトが同じリストへの参照を持たず、先生がひっかけ問題を好まない場合は気にしません)、新しいリストを作成して返すだけです。彼の答えのように。元のリストを変更する必要がある場合でも、xs[:] = [v for v in xs if v % 2 == 1]
その場で削除するのと同じようにそれを行います。
しかし、何らかの理由でその場で削除する必要がある場合 (そして、それが課題の要件のように思えます)、最も簡単な方法は最後からさかのぼって作業することです:
for index, value in list(enumerate(xs))[::-1]:
if not value % 2:
del xs[index]
リストから値を削除すると、それ以降の値が下に移動するだけなので、逆の順序でリストを確認することは、迷うことやテストしたい要素をスキップすることがないことを意味します。
* 説明は Python 1.x のもののようです。イテレータ プロトコルが公開されたので、不特定の場所に内部カウンタを保持することについて話す必要はありません…</p>
xs=[1,2,3,4,5,6]
not_even = []
for i in xs:
if i%2 != 0:
not_even.append(i)
print not_even
#output: [1, 3, 5]
リスト内包表記を使用して行うこともできます。
[i for i in xs if i%2 != 0]