4

targetsいくつかの文字列のいずれかが、指定された任意の数のいずれかで始まるかどうかを確認しようとしていますprefixes。例:

prefixes = ["a", "b", "c"]
targets = ["abar", "xbar"]

次に、のいずれかの要素にtargetsにあるプレフィックスがあるかどうかを確認しprefixesます(そして、それらの要素とtargetsそれらが一致した最初のプレフィックスを見つけます)。これが適合する"abar"唯一の要素です。私自身のバージョンは次のとおりです。

for t in target:
  if any(map(lambda x: t.startswith(x), prefixes)):
    print t

プレーンなPythonまたはnumpyを使用するより良い/より短い/より速い方法はありますか?

4

4 に答える 4

2

@DSMと同じ

フィルターを使用できます

>>> prefixes = ("a", "b", "c")
>>> targets = ["abar", "xbar"]
>>> filter(lambda t: t.startswith(prefixes), targets)
['abar']
于 2013-02-27T04:54:43.910 に答える
2

すべての一致が必要な場合は、次のリスト内包表記を使用してください。

>>> from itertools import product
>>> matches = [(t,p) for t,p in product(targets,prefixes) if t.startswith(p)]
>>> print(matches)
[('abar', 'a'), ('cbar', 'c')]

最初のものだけが必要な場合は、ジェネレータ式としてリスト内包表記とともに next を使用します。一致が存在するかどうかを判断したいだけの場合、これはショートサーキットになります。

>>> nextmatch = next(((t,p) for t,p in product(targets,prefixes) if t.startswith(p)), None)
>>> print(nextmatch)
[('abar', 'a')]
于 2013-02-27T17:21:46.910 に答える
1

複数の一致がある可能性があるため、結果のリストを使用してプレフィックスを保存しました

>>> prefixes = ["a", "b", "c"]
>>> targets = ["abar", "xbar"]
>>> result = {t:[p for p in prefixes if t.startswith(p)] for t in targets}
>>> result
{'abar': ['a'], 'xbar': []}

空のリストをフィルタリングする必要がある場合

>>> result = {k:v for k,v in result.items() if v}
>>> result
{'abar': ['a']}
于 2013-02-27T05:27:48.740 に答える
0

正規表現? Re モジュール Python の正規表現

于 2013-02-27T04:42:21.103 に答える