1

Python 3では、文字列のリストと1つの文字列をパラメーターとしてfind(string_list, search)受け取り、指定された検索文字列を含むすべての文字列のリストを返す関数を作成しようとしています。string_listsearchstring_list

したがってprint(find(['she', 'sells', 'sea', 'shells', 'on', 'the', 'sea-shore'], 'he')) 、次のように出力します。

['she', 'shells', 'the']

これが私がこれまでに試したことです:

def find(string_list, search):
    letters = set(search)
    for word in string_list:
        if letters & set(word):
            return word
    return (object in string_list) in search

ランニングprint(find(['she', 'sells', 'sea', 'shells', 'on', 'the', 'sea-shore'], 'he'))

私が期待したこと=[she, shells, the]

私が得たもの=[she]

4

2 に答える 2

2

これは次の方法で実行できます。

def find(string_list, search):
    return [s for s in string_list if search in s]
于 2013-03-18T01:40:03.563 に答える
2

コード例の主な問題は、関数から戻ることができるのは1回だけであり、その時点で関数の実行が停止することです。これが、関数が1つの値のみを返す理由です。

複数の値を返したい場合は、alistや。のようなコンテナオブジェクトを返す必要がありますset。リストを使用した場合のコードは次のようになります。

def find(string_list, search):
    letters = set(search)
    result = [] # create an empty list
    for word in string_list:
        if letters & set(word):
            # append the word to the end of the list
            result.append(word)
    return result

ここでのifテストは、実際には、問題の説明で求められていることを完全には実行していません。asetは順序付けられていないコレクションであるため、&操作は、2つのセットに共通の要素がある場合にのみテストでき、入力と同じ順序で表示されることはありません。例えば:

>>> letters = set("hello")
>>> word = set("olleh")
>>> word & letters
set(['h', 'e', 'l', 'o'])

ご覧のとおり、演算子は、2つのセット間で共通の要素を持つセットを返しています。セットにはTrue要素が含まれている場合であるため、これは実際には、検索文字列内のすべての文字が特定の項目に表示されるかどうかをテストし、指定された順序で一緒に表示されるかどうかをテストします。

より良いアプローチは、演算子を使用して文字列を直接テストすることです。in演算子は、(文字列に適用されると)ある文字列が別の文字列のサブ文字列であるかどうかを順番にテストします。

def find(string_list, search):
    result = []
    for word in string_list:
        if search in word:
            result.append(word)
    return result

リスト内のすべての項目を反復処理してテストを実行するこのパターンは非常に一般的であるため、Pythonは、リスト内包表記と呼ばれるこれを記述するためのより短い方法を提供します。これにより、このすべてを1つの式で実行できます。

def find(string_list, search):
    return [word for word in string_list if search in word]

これは前の例と同じように実行されますが、より簡潔です。

于 2013-03-18T02:00:24.647 に答える