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 必须在 for 循环之外,而不是在 if 语句之后,否则它会在检查完第一个字母之后返回 true。这解决了您的代码的问题:)

于 2012-10-21T16:49:37.337 回答
2

对于每个字母,您都会浏览列表。因此,如果列表很长n并且您有m字母,那么复杂度是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)

此外,将变量命名为不是一个好习惯,strlist好像您稍后需要创建list或使用str一样,它们将被您的变量遮蔽。

一些相关信息:

于 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 回答