是否可以使用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
答案 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
,那么它应该返回一个布尔值。