2016-04-22 6 views
3

私はPythonに慣れ親しむ過程にあり、私は現在 "リスト"の基本的な操作を見ています。リストのリストから特定のクラスのすべての要素を削除する

だから私の問題です。

は、私は2つの整数から主に「文字列」クラス要素脇に含まれているリストのリストを持っている:私は、文字列のみを含むリストのそれ以外の場合は変更されていないリストが残ってるので、私は唯一の整数クラスの要素を削除したいとし 要素:

listoflists=[['Juice', 'Pizza', 'Potatoes', 'Bananas', 5, 10], 
['eggs', 'ham', 'chicken', 'Pineapple'], 
'Onions'] 

と私は、これは次のようになりたい:私の元のリストすなわち

は次のとおりです

listoflist=[['Juice', 'Pizza', 'Potatoes', 'Bananas'], 
['eggs', 'ham', 'chicken', 'Pineapple'], 
'Onions'] 

は、これまでのところ、私は次のように単数形のリストから整数クラスの要素を削除する方法を見つけた:

no_integer_list = [x for x in listA if not isinstance(x, int)] 

しかし、私はリストのリストにこれを適用する方法のまわりで私の頭を取得するために苦労しています。

私は、マルチリスト内の各リストを読み込み、それぞれに上記のコードを適用するforループを作成することを考えていましたが、これを行う方法がわかりません。

これに関するお手伝いをさせていただきます。 事前に感謝します。

+0

あなたのサブリストはどれくらい深いですか? 1レベルのみ? – luke14free

+0

はい、1レベルのみ – Nathan

+0

最後の要素は意図的に文字列ですか? – miradulo

答えて

1
>>> [[i for i in item if not isinstance(i, int)] if isinstance(item, list) else item for item in listoflists] 
[['Juice', 'Pizza', 'Potatoes', 'Bananas'], 
['eggs', 'ham', 'chicken', 'Pineapple'], 
'Onions'] 

UPDATE:ちょうど完全性についてあなた外リストには、整数を持って、あなたはあまりにもそれらを削除する場合:

[[i for i in item if not isinstance(i, int)] if isinstance(item, list) else item 
for item in listoflists if not isinstance(item, int)] 
+1

これは、ネストされたリストの外側にある単一の項目は整数ではありません。 – Kasramvd

+0

しかし、それは私が質問で見るユースケースではありませんか?そして、コードは、ユーザーが望むものに正確になります。 – AKS

+0

@ Kasramvd私はそのユースケースをキャッチするために答えを編集しました。 – AKS

1

あなたのアプローチはcompletly結構ですが、あなたはすべてのためにそれを行う必要がありますサブリストには、map()関数またはリストの理解を使用します。

>>> l = [['Juice', 'Pizza', 'Potatoes', 'Bananas', 5, 10], ['eggs', 'ham', 'chicken', 'Pineapple'], 'Onions'] 
>>> map(lambda x: filter(lambda y: not isinstance(y,int),x),l) 
[['Juice', 'Pizza', 'Potatoes', 'Bananas'], ['eggs', 'ham', 'chicken', 'Pineapple'], 'Onions'] 

代わりのフィルターを使用して()およびマップ()、あなたはまた、同等のリスト内包メソッドを使用することができます。あなたが唯一のサブリストの1つのレベルを持っている(そして、あなたの最後の要素はリストではなく文字列である)と仮定すると

4

、あなたはとても

filtered = [[x for x in sublist if not isinstance(x, int)] for sublist in listoflists] 

出力のようなネストされたリストの内包表記を使用できます。

[['Juice', 'Pizza', 'Potatoes', 'Bananas'], ['eggs', 'ham', 'chicken', 'Pineapple'], ['Onions']] 

あなたの最後の要素は、意図的に文字列である(または可能性intすることができる)場合は、私がスクラップうただ厄介な1ライナー、これは単純にすべてのint各種タイプ - 他のタイプを削除するように設計されていることに注意が残りますので

def filter_list(listoflists): 
    newlist = [] 
    for element in listoflists: 
     if isinstance(element, list): 
      newlist.append([x for x in element if not isinstance(x, int)]) 
     elif isinstance(element, int): 
      continue 
     else: 
      newlist.append(element) 
    return newlist 

のような単純な関数を記述します。あなたは文字列のみを保持し、他のすべてのタイプを破棄したい場合は、否定を使用して停止を使用して

def filter_list(listoflists): 
    newlist = [] 
    for element in listoflists: 
     if isinstance(element, list): 
      newlist.append([x for x in element if isinstance(x, str)]) 
     elif isinstance(element, str): 
      newlist.append(element) 
    return newlist 
+0

downvoteについての説明は? :/ – miradulo

+1

最後の要素はリストではなく文字列です。 – AKS

+0

それでも動作しません、AKSの答えに対する私のコメントを確認してください。 – Kasramvd

0

(でも様々な深さ)、ネストされた任意の数のレベルのための柔軟な再帰的なソリューションとの両方にリストやタプルを持つことができます(出力はしかしリストになります):

eliminate_int = lambda l: [eliminate_int(x) if isinstance(x, list) or isinstance(x, tuple) \ 
          else x for x in l if not isinstance(x, int)] 

listoflists=[ ['Juice', 'Pizza', 'Potatoes', 'Bananas', 5, 10], 
       ['eggs', 'ham', 'chicken', 'Pineapple'], 
       'Onions' ] 

print(eliminate_int(listoflists)) 

出力:

[['Juice', 'Pizza', 'Potatoes', 'Bananas'], ['eggs', 'ham', 'chicken', 'Pineapple'], 'Onions'] 

See this code running on ideone.com

関連する問題