我正在转向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
另外,我希望有人能在这里提出可能的正则表达式方法。我也在尝试用它们。
答案 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)
此外,将变量命名为str
和list
并不是一个好习惯,就像稍后需要创建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)