2017-11-24 4 views
1

リストから負の数を削除しようとしています。私は2つの連続する負の数が取り除かれなかった問題にぶつかっていました。私のコードは非常に簡単です:反復 - Python

numbers = [-5, 1, -3, -1] 

    def remove_neg(num_list): 
     for item in num_list: 
      if item < 0: 
       num_list.remove(item) 

    print(remove_neg(numbers)) 
    #[1, -1] 

私は自分のコードの4つの異なるバージョンを試して、私の頭のうちのいくつかの毛を引っ張った後、オンラインで答えを見つけました。私が見つけた答えはr = numbers [:]と割り当てられ、最初のリストの代わりにrから項目が削除されました。

def remove_neg(num_list): 
     r = numbers [:] 
     for item in num_list: 
      if item < 0: 
       r.remove(item) 
     print(r) 

この概念では、2つのリスト変数が別々のデータを指していることを理解しています。私が理解できないことは、私の初期のコードがうまくいかない理由です。 for i in numbers:はリスト内のすべての項目を反復してはいけませんか?連続する2つの数字が同じように扱われないのはなぜですか?私は理由を探し求め、答えを見つけることができないように見えました。

答えて

0

最初の例では、繰り返している間にリストを変更しています。これまで見たように、繰り返しを混乱させます。 2番目の例はうまく動作しませんが、非常に効率が悪く、ネストを含まない新しいリストを作成するためにリスト内包表記を使う方がはるかに簡単です:

def remove_neg(num_list): 
    return [x for x in num_list if x > 0] 
+0

AH!あなたの最初の文が私の頭の中で電球をクリックした!今私はそれを得る!返信とリストの理解の例に感謝します。 – jmleczko