String包含列表的所有元素

时间:2012-10-21 16:46:50

标签: python regex list

我正在转向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

另外,我希望有人能在这里提出可能的正则表达式方法。我也在尝试用它们。

5 个答案:

答案 0 :(得分:12)

>>> all(x in 'tomato' for x in ['t','o','m','a'])
True
>>> all(x in 'potato' for x in ['t','o','m','a'])
False

答案 1 :(得分:3)

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

return true必须在for循环之外,而不是在if语句之后,否则它将在检查第一个字母后返回true。这解决了代码的问题:)

答案 2 :(得分: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一样,它们会被遮挡你的变量。

一些相关信息:

答案 3 :(得分: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)

答案 4 :(得分: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)