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