2016-07-29 2 views
1

リストをパラメータとして取り出し、空白または数値のいずれかを削除する関数を作成しました。以下のコード:私はそうのようなリストを使用してそれをテストし変数の型を取得する方法

def cleaner(List, filter_out=' '): 
    if filter_out == ' ': 
     for i in List: 
      if i == ' ': 
       List.remove(' ') 
    if filter_out == 'int': 
     for i in List: 
      if type(i) == int: 
       List.remove(i) 

myList = ['h' ' ', 'g', 1, 2, 3, 4, 5, 'p'] 
print(cleaner(myList, filter_out='int')) 

私は['h' ' ', 'g', 'p'] ではなく、プリントアウト['h ', 'g', 2, 4, 'p'] なぜそれが12を残したのを取得するために期待?私はそれがリストのすべての数字を除外すると思った。

+2

最初の最初のあなたが変数として組み込み型の名前を使用するか、パラメータはありません –

+5

二つ目の二番目に、それをどれ –

+0

を反復しながら、あなたはリストから削除しませんが、私は思いました私は 'type(i)'を書いています。組み込み型 'int 'と比較してください。 –

答えて

4

インデックス0から始まります。nums[0]1。あなたはそれを削除します。次のインデックスは1です。さて、[nums[1]3です。リストは[2, 3, 4]になっています。あなたがそれを印刷し、それを削除します。リストは今度は[2, 4]で、あなたは3番目のインデックスにいます。 nums[2]が存在しないため、2つの数字をスキップしてループが終了します。何をすべきことは組み込み関数を利用している:

myList = ... 
myList = filter(lambda x: not isinstance(x, int), myList) 

' 'の例については、それは次のようになります。

myList = ... 
myList = filter(str.strip, myList) 

または

myList = filter(lambda x: x != ' ', myList) 

:パイソン3 filter()関数は、リストではなくfilterオブジェクトを返します。これにより、反復処理がより効率的になりますが、本当にリストが必要な場合はlist(filter(...))を使用できます。

これらのすべてが、作業を実行する代わりにリストのコピーを作成します。代わりに、myList = ...filter()行)の代わりにmyList[:] = ...を使用してください。 Python 3 filterオブジェクトは、これを動作させるためにリストに変換する必要はありません。

+0

Python 3では、フィルタ関数はリストの代わりにジェネレータオブジェクトを返します。これにより、結果の完全なリストを作成することがなくなり、結果を使って行うすべてが反復処理であれば、何の違いもありません。 Python 3で実際のリストオブジェクトが必要な場合は、 'myList = list(filter(lambda x:x!= ''、myList))' –

+0

@JanBöcker:良い点を使用してください。それは編集されます。 – zondo

1

これは中規模のリスト

def cleaner(lst,filter_item = ' '): 
     if filter_item == ' ': 
      for i in list(lst): 
       if i == ' ': 
        lst.remove(' ') 
     elif filter_item == 'int': 
      for i in list(lst): 
       if type(i) == int: 
        lst.remove(i) 

myList = ['h' ' ', 'g', 1, 2, 3, 4, 5, 'p'] 
cleaner(myList, 'int') 
print(myList) 

またはよりよい方法のためにそれを行うための適切な方法のようになります。それは悪い結果につながる反復しながら、リストから項目を削除する

def cleaner(lst,filter_item = ' '): 
    retval = None 
    if filter_item == ' ': 
     retval = [i for i in lst if i != ' '] 
    elif filter_item == 'int': 
     retval = [i for i in lst if type(i) != int] 
    return retval 

myList = ['h' ' ', 'g', 1, 2, 3, 4, 5, 'p'] 
a=cleaner(myList) 
print(a) 
#['h ', 'g', 1, 2, 3, 4, 5, 'p'] 
a=cleaner(myList,'int') 
print(a) 
#['h ', 'g', 'p'] 
+0

は' filter'ではありません。 –

+0

ええ..ちょうどそれを修正しようとしていた.. :) –

+0

@マルコうーん..驚いている。あなたのコードはまだうまく動作しているようです:) –

関連する問題