【问题标题】:Return True if all characters in a string are in another string如果一个字符串中的所有字符都在另一个字符串中,则返回 True
【发布时间】:2015-05-13 20:36:33
【问题描述】:

好吧,所以对于这个问题,我打算编写一个函数,如果给定字符串仅包含来自另一个给定字符串的字符,则该函数返回 True。因此,如果我输入“bird”作为第一个字符串,输入“irbd”作为第二个字符串,它将返回 True,但如果我使用“birds”作为第一个字符串,“irdb”作为第二个字符串,它将返回 False。到目前为止,我的代码如下所示:

def only_uses_letters_from(string1,string2):
"""Takes two strings and returns true if the first string only contains characters also in the second string.

string,string -> string"""
if string1 in string2:
    return True
else:
    return False

当我尝试运行脚本时,它只返回 True 如果字符串的顺序完全相同,或者我只输入一个字母(“bird”或“b”和“bird”与“bird”和“irdb” )。

【问题讨论】:

  • string1 in string2 == True iff string1string2 的子字符串

标签: python string boolean


【解决方案1】:

这是sets 的完美用例。以下代码将解决您的问题:

def only_uses_letters_from(string1, string2):
   """Check if the first string only contains characters also in the second string."""
   return set(string1) <= set(string2)

【讨论】:

  • 关闭。将 &lt; 更改为 &lt;= -- 否则 only_uses_letters_from("bird", "bird") =&gt; False
  • 好收获。编辑了我的答案。
【解决方案2】:

集合很好,但不是必需的(根据您的字符串长度可能效率较低)。你也可以这样做:

s1 = "bird"
s2 = "irbd"

print all(l in s1 for l in s2)  # True

请注意,一旦在s2 中找不到s1 中的字母并返回False,这将立即停止。

【讨论】:

  • 这将在O(n * m) 中运行,因为它会重复遍历 s2。考虑“aaaaa”和“bbbba”。使用集合,它将在O(n)O(m) 中运行,以较大者为准。
  • 最坏的情况,是的。然而,它也会短路——这是您不应忽视的发电机特性。
  • 性能取决于字符串的组成。集合保证您将遍历每个完整列表。这种方法可以在对s2 进行一次迭代后退出。如果列表包含许多重复值,则性能有利于使用集合。如果s1 不太可能是s2 的子集,那么性能将有利于这种方法。内存也可能是一个因素,等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 2020-05-11
  • 2015-06-18
相关资源
最近更新 更多