1

で演習を行っていますCheckIOが、なぜこれが機能しないのか疑問に思っています。文字列のセットが与えられた場合、文字列のいずれかがセット内の他の文字列のサフィックスである場合、True を返そうとしています。それ以外の場合は偽。itertools を使用して、最初にタプルで必要な順列を生成しています。次に、各タプル (各 i) について、2 番目のタプルが最初のタプル (オプション 1) の最後にある場合の難しい方法を確認したかったのです。他の方法では .endwith 関数 (オプション 2) を使用していましたが、どちらもうまくいきません。これら 2 つのオプションに欠陥があるのはなぜですか?

import itertools

def checkio(words_set):
    for i in itertools.permutations(words_set, 2):
    #option1 ---- if i[1] in i[0][-len(i[1]):]:
    #option2 ---- if i[0].endswith(i[1]):
            return True
        else:
            return False

例:

checkio({"hello", "lo", "he"}) == True

checkio({"hello", "la", "hellow", "cow"}) == False

私はこれが答えとして機能することを知っています。しかし、なぜ私の元の方法がうまくいかないのか疑問に思っています。

def checkio(words_set):
    for w1 in words_set:
        for w2 in words_set:
           if w1.endswith(w2) and w1 != w2:
               return True
    return False
4

3 に答える 3

1

forreturn Falseループの最後にいる必要があります。そうしないと、関数は最初の比較ごとに True/False を返し、後続のすべての比較を無視します。

import itertools

def checkio(words_set):
    for i in itertools.permutations(words_set, 2):
        if i[0].endswith(i[1]):
            return True

    return False
于 2015-04-23T19:40:42.707 に答える
0

return False最初のチェックの直後だからです。失敗した場合は戻ります。ループFalseから外す必要があります。for

しかし、より Pythonic な方法として、 functioncombinations内でジェネレーター式を使用できます。any

>>> from itertools import combinations
>>> s={"hello", "lo", "he"}
>>> any(i.endswith(j) or j.endswith(i) for i,j in (combinations(s,2)))
True
>>> s2={"hello", "la", "hellow", "cow"}
>>> any(i.endswith(j) or j.endswith(i) for i,j in (combinations(s2,2)))
False
于 2015-04-23T19:39:25.840 に答える
0

演習なので完全な回答はしませんが、本当に節に入れたいreturn Falseですelseか?

于 2015-04-23T19:39:40.977 に答える