在if / else语句中测试空列表理解

时间:2017-10-12 13:26:31

标签: python if-statement list-comprehension

是否可以使用if / else语句将方法find_indexes中的行数减少到1行,如返回语句中所示?

def find_indexes(sentence, target):
    indexes = [index for index, x in enumerate(sentence.split()) if target == x]

    return indexes if indexes else False

target = 'dont'
sentence = 'we dont need no education we dont need no thought control no we dont'

print(find_indexes(sentence, target))
>> [1, 6, 13]
print(find_indexes(sentence, 'johndoe'))
>> False

我希望将方法改为这样的方式,而不需要写两次理解:

def find_indexes(sentence, target):
    return [index for index, x in enumerate(sentence.split()) if target == x] \ 
       if [index for index, x in enumerate(sentence.split()) if target == x] else False
  

编写一个过程,该过程采用由空格分隔的单词串   (假设没有标点符号或大小写),以及“目标”   单词,并显示目标单词在字符串中的位置   词语的

     

例如,如果字符串是:

     

我们不需要任何教育,我们不需要任何思考控制,不,我们不

     

目标是单词:

     

“不要”

     

然后你的程序应该返回列表1,6,13因为“不要”出现   在弦乐的第1,第6和第13位置。 (我们开始计算   0的字符串中的单词位置。)您的程序应该返回   如果目标词未出现在字符串

中,则返回false

4 个答案:

答案 0 :(得分:4)

如果找不到匹配项,只需返回空列表。

def find_indexes(sentence, target):
    return [index for index, x in enumerate(sentence.split()) if target == x]

indices = find_indexes("hi there bob", "bob")
if not indices:
    print("No matches found")
else:
    for i in indices:
        print("Found match at {}".format(i))

答案 1 :(得分:3)

return [...] or False

or运算符返回其中一个操作数;第一个如果第一个是真理,否则第二个。

答案 2 :(得分:3)

您可以使用or

进行短路
def find_indexes(sentence, target):
    return [i for i, x in enumerate(sentence.split()) if target == x] or False

答案 3 :(得分:1)

返回False不仅毫无意义,它会使代码变得更大,更脆弱。

每次使用原始find_indexes函数时,都需要检查它是布尔值还是列表。否则,如果未找到索引,则代码可能会引发TypeError

def find_indexes(sentence, target):
    indices = [index for index, x in enumerate(sentence.split()) if target == x]
    return indices if indices else False

sentence = 'we dont need no education we dont need no thought control no we dont'

for index in find_indexes(sentence, "not_found"):
    print(index)

它抛出:

TypeError: 'bool' object is not iterable

正如@chepner所建议的,如果没有找到索引,只返回一个空列表:无论如何,Python中的空列表都是假的。您的功能和每次后续通话都需要少一行。

最后,由于Python是一种动态语言,因此使用足够的函数名来编写可读代码非常重要。如果你的函数被称为find_indexes,它应该返回一个iterable。如果它被称为is_a_substring,那么它应该返回一个布尔值。