检查列表中的任何元素是否以Python中的任何前缀开头?

时间:2013-02-27 04:39:00

标签: python string numpy

我正在尝试检查任意数量的字符串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 个答案:

答案 0 :(得分:2)

与@DSM相同

您可以使用过滤器

>>> prefixes = ("a", "b", "c")
>>> targets = ["abar", "xbar"]
>>> filter(lambda t: t.startswith(prefixes), targets)
['abar']

答案 1 :(得分: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')]

如果您只想要第一个,请使用list comprehension作为生成器表达式。如果您只是想确定是否存在任何匹配,这将会短路。

>>> nextmatch = next(((t,p) for t,p in product(targets,prefixes) if t.startswith(p)), None)
>>> print(nextmatch)
[('abar', 'a')]

答案 2 :(得分: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']}

答案 3 :(得分:0)