布尔比较两个字符串

时间:2016-12-08 20:13:58

标签: python string boolean compare

def valid(s, alphabet):
    """ (str, str) -> bool

    Return True iff s is composed only of characters in alphabet.

    >>> valid('adc', 'abcd')
    True
    >>> valid('ABC', 'abcd')
    False
    >>> valid('abc', 'abz')
    False
    """
    for ch in s:
        if ch in alphabet:
            return True
        else:
            return False

我做了一些错误检查,我发现在ch中只检查它,直到它看到返回True值。

我的代码适用于前两个,但是第三个代码只检查a,然后返回True并且不检查其他值。

如何让for循环遍历每个字母并用另一个字符串检查?

4 个答案:

答案 0 :(得分:1)

如果存在任何不匹配字符并且从for循环返回True,则只需要通过返回False来调整逻辑。

for ch in s:
    if ch not in alphabet:
        return False  # 1
return True  # 2

关键是如果python执行#1它退出循环,所以它永远不会遇到#2,直到alphabet中存在所有字符。

除此之外,你还有其他选择可能更加pythonic。 On正在使用set()对象及其正确的方法。另一个是使用内置函数,如allany

但请注意,有时将字符串转换为set的成本可能高于复杂性成本。因此,您应该根据自己的需要选择最佳方式。您可以使用timeit模块来测量执行时间。

以下是使用set()的其中一个答案和使用all()的基于生成器的方法的时间表:

In [1]: a = 'abc'

In [2]: b = 'abcd'

In [8]: def regular(s, alphabet):
            for ch in s:
                if ch not in alphabet:
                    return False  # 1
            return True
   ...:     

In [9]: def valid(s, alphabet):
            return set(s) < set(alphabet)
   ...: 

In [10]: def generator(s, alphabet):
             return all(ch in alphabet for ch in s)

In [11]: %timeit regular(a, b)
1000000 loops, best of 3: 262 ns per loop

In [12]: %timeit valid(a, b)
1000000 loops, best of 3: 635 ns per loop

In [13]: %timeit generator(a, b)
1000000 loops, best of 3: 639 ns per loop

答案 1 :(得分:0)

使用set差异并检查将字母表中的所有字母减去该单词是否为空集:

def valid(s, alphabet):
    return not set(s) - set(alphabet)

使用allset的另一种方法可以获得更好的查找效果:

def valid(s, alphabet):
    sa = set(alphabet)
    return all(x in sa for x in s) # True if condition True for all chars

答案 2 :(得分:0)

将参数转换为set个对象,并检查一个集合是否是其他集合的正确子集:

def valid(s, alphabet):
    return set(s) < set(alphabet)

print(valid('ABC', 'abcd'))  # False
print(valid('abc', 'abcd'))  # True
  

设置&lt;其他
  测试集合是否是其他集合的正确子集,即设置&lt; = other并设置!= other。

https://docs.python.org/3/library/stdtypes.html#set

答案 3 :(得分:0)

第一次找到字母表中的字符时,您的方法返回True。这意味着该方法以布尔值True作为其输出结束。因此,您的for循环不会继续,也不会检查剩余的字符。

要解决此问题,您可以将代码更改为:

for ch in s:
    if ch not in alphabet:
        return False
return true

通过这种方式,当找到不在字母表中的字符(返回False)或者已经检查了所有字符并且它们都在字母表中(返回True)时,方法结束。