2017-10-12 16 views
1

find_indexesの行数をreturn文のようにif/else文を使って1行に減らすことはできますか?私は二度、理解を記述することなく、このようなものにする方法を変更しているよif/else文で空リストの理解をテストする

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位に "dont"が表示されるので、プロシージャはリスト1,6,13を返します。 (私たちは、0から、文字列内の単語の 位置をカウント開始)あなたの手順では、対象の単語が文字列に表示されていない場合

+1

'return [indexのインデックス、xは列挙する(sentence.split())if target == x]またはFalse' – mshsayem

+3

注:明示的に' False'を返すのは無意味です。単にlistcomp自体を返してください。それが空であれば、それは偽の値として振る舞い、99%の時間、それはうまくいっています(またはそれはまだシーケンスのように動作するので、より良いより良いので、結果に対して盲目的に 'for'ループを行うことができます。単に何もしません)。実際の 'True' /' False'値を主張するのは一般的にPythonではなく、暗黙の真実性テストを行うだけです。 – ShadowRanger

+5

なぜ[False]は '[]'よりも良い戻り値だと思いますか?空リストは、ブール値を使用する必要のあるコンテキストでは 'False'として扱われます(そして' foo == False'を明示的に数えています)。 – chepner

答えて

3

することができますorとショート:

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

orオペレータがそのオペランドの1を返し Falseを返す必要があります。最初のものが真実ならば最初のもの、それ以外のものは真実のものです。

4

見つかった一致がない場合だけで空のリストを返します。 Falseを返す

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)) 
+0

確かに。私はそれが単語であると認識しましたが、それがキーワードであることを覚えて次のステップを踏み出しませんでした。 – chepner

1

それはコードがより大きく、よりもろくなり、だけでなく、無意味です。

元の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では偽です。あなたの機能とすべての息子の呼び出しでは、1行少なくする必要があります。

最後に、Pythonは動的言語なので、読みやすいコードを書くために適切な関数名を使用することが非常に重要です。あなたの関数がfind_indexesと呼ばれるなら、iterableを返すべきです。それがis_a_substringと呼ばれるならば、ブール値を返すべきです。

関連する問題