布尔比较两个字符串


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中仅检查它才能看到返回的真实值。

我的代码适用于前两个,但在第三个方面仅检查a,然后返回true并且不检查其他值。

如何使for循环通过每个字母并使用另一个字符串检查?

如果有任何不匹配字符,您只需要通过返回false来调整逻辑,然后返回true for for for for for loop。

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

关键是,如果Python执行#1,它将退出循环,因此它永远不会符合#2,直到所有字符都存在于alphabet中。

除此之外,您还有其他选择可能会更重要的选择。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

使用 set差异并检查从字母到单词的所有字母的划分使一个空集:

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

使用all的另一种方法和一个set以获得更好的查找性能:

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

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

def valid(s, alphabet):
    return set(s) < set(alphabet)
print(valid('ABC', 'abcd'))  # False
print(valid('abc', 'abcd'))  # True

set&lt;其他
测试该集合是否是另一个适当的子集,即Set&lt; = other and set!=其他。

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

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

要解决此问题,您可以更改代码以使其看起来像:

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

通过这种方式,当找到不在字母中的字符(返回false)或检查所有字符并且已检查所有字符并且都在字母中时,该方法要么完成(返回true)。

最新更新