3

リストの内容を特定のパターンと一致させ、一致以外のすべてを含む別のリストを作成する必要があります。つまり、除外リストを作成しようとしています。

これで、1 つのパターン マッチで簡単になりました。しかし、それ以上になると難しくなります。

例を見てみましょう:

Lmain=[arc123, arc234,xyz111,xyz222,ppp999,ppp888]

for count in range(len[Lmain]):

    if Pattern matches Lmain[i]:
              Pass
    else:result.append(Lmain[i])

ここで、 pattern = arc としましょう。私の結果は次のようになります。

result = [xyz111,xyz222,ppp999,ppp888]

これは単なるロジックであり、一致を見つけるために通常の expr を使用します。

2 つのパターンがある場合、上記のロジックをループで使用します。

Pattern=['arc','xyz']

for pat in Pattern:
      if pat matches Lmain[i]:
          Pass
      else:result.append(Lmain[i])

これは間違った結果をもたらします

result = [xyz111,xyz222,ppp999,ppp888,arc123,arc234,ppp999,ppp888]

したがって、上記のロジックが機能しないことがわかります。

私の計画:

最初に、結果が得られる最初のパターンの除外リストを見つけます。

result = [xyz111,xyz222,ppp999,ppp888]

2 番目のパターンについては、上記の結果を調べる必要があります。

if Pattern matches Result[i]:
      Pass
else:result_final.append(Result[i])

上記のロジックを実装するには、再帰を使用する必要があると思います。では、どうすればよいのでしょうか。また、ユーザーが入力しようとしているパターンの数もわかりません。1 つまたは複数にすることができます。

誰でも論理的なアイデアを持っているので、共有してください。

4

3 に答える 3

5

リスト内包表記とジェネレーター式を使用し、除外リストを作成する中間ステップをスキップして、最終的なリストを作成するだけです。

>>> import re
>>> Lmain=['arc123', 'arc234', 'xyz111', 'xyz222','ppp999','ppp888']
>>> Pattern=['arc','xyz']
>>> [x for x in Lmain if not any(re.search(y, x) for y in Pattern)]
['ppp999', 'ppp888']
于 2012-05-22T13:18:52.340 に答える
4
for item in lst:
    if all(pat not in item for pat in patterns):
        exclude_list.append(item)

あなたの場合により適切なものに置き換えinてください(例item.startswith(pat)

不一致よりも一致が多い場合は、最初に一致を見つけてから除外する方が効率的です。

matches = [x for x in lst if any(x.startswith(p) for p in patterns)]
exclude_list = list(set(lst).difference(matches))

さらに別の (そしておそらく最速の) オプションは、正規表現を使用することです (ここでは と組み合わせてfilter):

import re
expr = '^(?!%s)' % '|'.join(patterns)
exclude_list = filter(re.compile(expr).search, lst)
于 2012-05-22T13:17:25.427 に答える
1
matched = False
for pat in Pattern:
    if pat patches Lmain[i]:
        matched = True
        break;
if matched:
    Pass
else:
    result.append(Lmain[i])
于 2012-05-22T13:16:32.843 に答える