4

我正在尝试检查多个字符串targets中的任何一个是否以任意数量的 given 开头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

常用表达? 重新模块 Python 的正则表达式

于 2013-02-27T04:42:21.103 回答