2015-07-03 109 views
1

我有一个输入字符串一个的索引,它看起来像:寻找替代关键字

input_string = "word1 word2 word3 word5 key1 word6 word7"

我要检查它是否包含给定的关键字列表中的一个

keywords = ['key1', 'key2', 'key3' ]

并将变量的值设置为字符串中该关键字的索引,否则设置为无。例如。在input_string它上面将是4

我目前的解决办法是这样的:

try: 
    key_index = input_string.split().index(filter(lambda x: x in input_string.split(), keywords).__next__()) 
    return_value = key_index 
except (StopIteration, ValueError): 
    return_value = None 

替代,迭代版本是这样的:

n = 0 
return_value = None 
words = input_string.split() 
for w in words: 
    if w in keywords: 
    return_value = n 
    break 
    else: 
    n += 1 

或者:

return_value = None 
for k in keywords: 
    if k in input_string.split(): 
    try: 
     return_value = input_string.split().index(k) 
    except ValueError: 
     pass 

所有这些解决方案对于这样一个简单的问题似乎有点笨拙。我正在寻找更优雅的解决方案,最好是以功能性风格。 python3.x只有解决方案可以。

回答

3

您可以使用列表理解

>>> [i for i, j in enumerate(input_string.split()) if j in keywords] 
[4] 
>>> 

您还可以使用index

>>> [input_string.split().index(i) for i in keywords if i in input_string.split()] 
[4] 
0

这会给你是字符串中的密钥索引列表:

indexes = [input.index(key) for key in keys if key in input] 
+0

我需要有字符串中的关键指数。不只是它是否包含关键字。 –

+0

这个答案和我的一样 – styvane

2

如果你只想要第一个idx:

for idx, value in enumerate(input_string.split()): 
    if value in keywords: 
     break 
else: 
    idx = None 

else将过程只有for完成,无需break