7

私は Python に移行していますが、Pythonic アプローチにはまだ比較的慣れていません。文字列とリストを受け取り、リスト内のすべての要素が文字列内にある場合に true を返す関数を書きたいと思います。


これはかなり単純に思えました。しかし、私はそれにいくつかの困難に直面しています。コードは次のようになります。


def myfun(str,list):
   for a in list:
      if not a in str:
         return False
      return True

Example : myfun('tomato',['t','o','m','a']) should return true
          myfun('potato',['t','o','m','a']) should return false
          myfun('tomato',['t','o','m']) should return true

また、誰かがここで可能な正規表現アプローチを提案できるかどうかを期待していました。私もそれらに手を出そうとしています。

4

5 に答える 5

15
>>> all(x in 'tomato' for x in ['t','o','m','a'])
True
>>> all(x in 'potato' for x in ['t','o','m','a'])
False
于 2012-10-21T16:49:34.203 に答える
3
def myfun(str,list):
   for a in list:
      if not a in str:
         return False
   return True

return true は、if ステートメントの直後ではなく、for ループの外にある必要があります。そうしないと、最初の文字がチェックされた直後に true が返されます。これはあなたのコードの問題を解決します:)

于 2012-10-21T16:49:37.337 に答える
2

各文字について、リストを調べます。したがって、リストが長くnm文字がある場合、複雑さはO(n*m)です。O(m)そして、単語を前処理すれば達成できるかもしれません。

def myfun(word,L):
    word_letters = set(word) #This makes the lookup `O(1)` instead of `O(n)`
    return all(letter in word_letters for letter in L)

また、後で を作成または使用する必要があるかのようstrに、変数に名前を付けることはお勧めできません。それらは変数によって影が付けられます。listliststr

関連情報:

于 2012-10-21T16:52:46.003 に答える
2

文字の繰り返しが気にならない場合は、次のようにします。

def myfunc(string, seq):
    return set(seq).issubset(string)

そして、テストされていませんが、繰り返される文字が気になる場合は、おそらく(テストされていません):

from collections import Counter
def myfunc(string, seq):
    c1 = Counter(string)
    c2 = Counter(seq)
    return not (c2 - c1)
于 2012-10-21T16:58:26.133 に答える
0

楽しみのために、イテレータとマップを使ってやろうと思いました:

from operator import contains
from itertools import imap, repeat

def myfun(str, list):
    return all(imap(contains, repeat(str), list))

次に、これは基本的に受け入れられた回答と同じことを行いますが、おそらくより多くのメソッド呼び出しを行うことに気付きました。

def myfun(str, list):
    return all(letter in str for letter in list)
于 2012-10-21T17:54:05.117 に答える