2017-03-13 13 views
1

私は文字列のリストと部分文字列のリストを持っています。私は文字列のリストにない部分文字列のリストを生成したい。文字列のリストにない部分文字列のリストを生成する

substring_list=["100", "101", "102", "104", "105"] 
string_list=["101 foo", "102 bar", "103 baz", "104 lorem"] 

私はnew_list = [s for s in substring_list if s not in [i for i in string_list]]を実行しようとしましたが、これは動作しません。私はまたany()の様々な使用を試みたが運がなかった。

返信したいと思います。new_list=["100", "105"]

答えて

5

あなたはこれを試すことができます。代わりに

[sub for sub in substring_list if all(sub not in s for s in string_list)] 
# ['100', '105'] 

または: "私はSTRING_LISTには、" 作成する新しいセットの同一STRING_LIST配列はそれが解決

[sub for sub in substring_list if not any(sub in s for s in string_list)] 
# ['100', '105'] 
+1

優れています。これは私が必要としていたものです。ありがとう。 – p014k

+0

なぜ2番目の方法がより効率的になりますか? –

+0

そして、 'all'はfalseに遭遇するたびに反復を止めますが、' any'は真になるまで継続しなければなりません。私は、入力データがどんなものであれ、 'すべてではない'と '全くではない 'が完全に同等であると言うでしょう。 –

-1

コード書か戻り、すべてのために簡単に分けて臓器を分割してstring_listを恩恵を受ける。そして、あなたがi [0]を開始するとき、同様のstring_listシステムを作成するが、文字なしの数字のみを含む。

ので

new_list = [s for s in substring_list if s not in [i.split()[0] for i in string_list]] 
+0

このコードスニペットは歓迎されていますが、いくつかの助けを与えるかもしれませんが、* how *と* Why *がこれを解決する(説明があれば大幅に改善されます)(// meta.stackexchange.com/q/114762)問題。あなたが今質問している人だけでなく、将来読者のための質問に答えていることを忘れないでください!説明を追加するためにあなたの答えを[編集]し、どんな制限と前提が適用されるかを示してください。 –

1

Pythonはanyallを持っているので、Rubyの背景から来て、私はnone関数やメソッドを探したが、それは存在しません見て驚きました。

あなたは、多くの場合、not anyまたはall notを使用する場合、none()を定義するのは興味深いことができます

def none(iterable): 
    for element in iterable: 
     if element: 
      return False 
    return True 

substring_list = ["100", "101", "102", "104", "105"] 
string_list = ["101 foo", "102 bar", "103 baz", "104 lorem"] 

print([sub for sub in substring_list if none(sub in s for s in string_list)]) 
# ['100', '105'] 

それはしかしNoneとの混乱につながる可能性があります。おそらくそれが存在しない理由です。

関連する問題