7

リスト内包表記を使用してこのコードを改善できるかどうかを確認しようとしています。
次のリストがあるとしましょう。

a_list = [
        'HELLO',
        'FOO',
        'FO1BAR',
        'ROOBAR',
        'SHOEBAR'
        ]

regex_list =   [lambda x: re.search(r'FOO', x, re.IGNORECASE),
                lambda x: re.search(r'RO', x, re.IGNORECASE)]

基本的に、一致しないすべての要素をregex_list別のリストに追加したいと考えています。

例 ==>

newlist = []
for each in a_list:
    for regex in regex_list:
        if(regex(each) == None):
            newlist.append(each)

リスト内包表記を使用してこれを行うにはどうすればよいですか? それは可能ですか?

4

2 に答える 2

18

確かに、これでいいと思います

newlist = [s for s in a_list if not any(r(s) for r in regex_list)]

編集: よく調べてみると、コード例が実際にすべてa_listの正規表現と一致しない各文字列を新しいリストに追加していることに気付きました。さらに、一致しない正規表現ごとに各文字列を 1 回追加します。私のリスト内包表記は、あなたが意図したことを実行します。つまり、どの正規表現にも一致しない各文字列のコピーを 1 つだけ追加します。

于 2009-05-05T19:02:28.990 に答える
0

私はあなたのコードをこれに落とし込みます:

a_list = [
          'HELLO',
          'FOO',
          'FO1BAR',
          'ROOBAR',
          'SHOEBAR'
          ]
regex_func = lambda x: not re.search(r'(FOO|RO)', x, re.IGNORECASE)    

次に、2 つのオプションがあります。

  1. フィルター

    newlist = filter(regex_func, a_list)

  2. リスト内包表記

    newlist = [x for x in a_list if regex_func(x)]

于 2009-05-05T19:14:04.097 に答える