2017-04-23 4 views
0

私のコードは、見える文字列の一部をスキップします。なぜ私のコードはすべての文字列をフィルタリングしますか?

def filter_list(l): 
for i in l: 
    if type(i) == str: 
     l.remove(i) 
return l 

print filter_list([1, 2, 3, '4', '5', 6, '7', 8]) 

それは出力:

[1, 2, 3, '5', 6, 8] 

をコメントで述べたように「5」の文字列

+0

あなたは反復処理中のリストを変更しています。これは通常涙で終わります。リストを理解してみてください。 –

答えて

0

をスキップ:あなたはそれを反復している間、あなたがない限り(リストを変更しないでください本当にあなたがやっていることを知っている)。

およびisinstanceは、比較すると通常typeよりも安全です。あなたがこれを行うことができlist-comprehension

:実行フローが位置3での最初の文字列"4"に遭遇すると

def filter_list(l): 
    return [item for item in l if not isinstance(item, str)] 

print(filter_list([1, 2, 3, '4', '5', 6, '7', 8])) # [1, 2, 3, 6, 8] 
0

を、それを削除し、"5"がインデックス3になりますので、左に残りのすべてのアイテムを移動させます。しかし、次のループの繰り返しは4になるので、"5"をスキップします。

def filter_list(l): 
    return list(filter(lambda i: not isinstance(i,str), l)) 

print filter_list([1, 2, 3, '4', '5', 6, '7', 8]) 

出力:

が適切なフィルタ処理を実行するfilter()関数を使用して、次のアプローチを検討繰り返しながら、

[1, 2, 3, 6, 8] 
0

取り外し要素を、遅く、危険です。最良の選択は、新しいリストnew_list = [x for x in l if not isinstance(x,str)]を作成することです。リストは本当に大きい場合は、最初に条件に一致するすべての要素を検索し、後

strings = [i for i,x in enumerate(l) if isinstance(x,str)] 
for x in reversed(strings): 
    del l[x] 

だから、最初の選択肢(最速)それらを削除することができます

def filter_list(l): 
    return [x for x in l if not isinstance(x, str)] 

print(filter_list([1, 2, 3, '4', '5', 6, '7', 8])) 

値の第2の(場合の数をリストのサイズが大きい):

def filter_list(l): 
    strings = [i for i, x in enumerate(l) if isinstance(x, str)] 
    for x in reversed(strings): 
     del l[x] 

l = [1, 2, 3, '4', '5', 6, '7', 8] 
filter_list(l) 
print(l) 
+0

そうでしょう 「code'def filter_list(L): 指数=リットルで私のために[] : かのタイプ(I)= STR:! indices.append(I) リターン指数 'コード' 作品より良い? –

+0

コメントのコードフォーマットにするにはどうしたらいいですか? –

+0

@LoganPipes、編集済み – Sklert

関連する問題