如果第一个字符串中的字母也包含在第二个字符串中,我希望能够返回True
。例如,only_uses_letters_from("boffo","foobar")
应返回True
。以下是我到目前为止的情况:
def only_uses_letters_from(x, y):
"""returns true if the first string only contains characters that are also in the second string
str, str -> str"""
for letter in x:
if x in y:
return True
else:
return False
答案 0 :(得分:2)
您可以使用set.issubset检查a中的每个元素是否在b:
中a, b = "boffo", "foobar"
print(set(a).issubset(b))
True
所以在你的功能中:
def only_uses_letters_from(x, y):
return set(x).issubset(y)
或者使用all
,检查x
中的每个字母都是in
b
:
def only_uses_letters_from(x, y):
return all(letter in y for letter in x)
如果我们在x中找到一个不在y中的字母并且返回False,如果所有字母都在y中,那么它将返回True。
如果你有大量数据使用集合可以快速检查一个迭代中的任何元素是否在另一个迭代中:
def only_uses_letters_from(x, y):
st = set(y) # O(1) lookups
return all(letter in st for letter in x)
答案 1 :(得分:0)
此处的方法是针对x
中的每个字符检查它是否也在y
中。如果某个字符不是这种情况,则答案为False
:
def only_uses_letters_from(x, y):
for c in x:
if c not in y:
return False
return True
答案 2 :(得分:0)
您的代码逻辑有问题,如果第一个字母在字符串中,它将立即返回true。以下代码可以使用:
def foo(x, y):
for letter in x:
if letter not in y:
return False
return True
print foo("booffo", "foobar")
答案 3 :(得分:-1)
Pythonic方式:
def only_uses_letters_from(str1, str2):
return all(letter in str2 for letter in str1)
这传达了你的逻辑并使其可读。
不要使用set()优化大字符串!
有一些建议用set()预处理其中一个字符串,以便在字符串很大时优化搜索。这是错的。在集合中搜索速度更快,但创建集合本身要比在字符串中搜索要慢得多。
使用timeit
表示在我的机器上创建一个包含1.000.000个字母的字符集约需50毫秒,只需运行原始函数的时间不到1毫秒。
python -m timeit -n 1000 -s setup='str2 = "".join("abc" for i in xrange(1000000))' 'set(str2)'