检查字符串中是否包含特定字符

2024-04-20 02:35:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要找到并计算一个字符串中可以找到多少个字符。我把字符分成了chars1[a:m]和chars2[n:z],并且有两个计数器。

输出应该是0/14,但应该是0/1。我认为它只检查是否包含一个且只有一个项,然后退出循环。是这样吗?

这是密码。

string_1 = "aaabbbbhaijjjm"

def error_printer(s):
    chars1 = "abcdefghijklm"
    chars2 = "nopqrstuvwxyz"
    counter1 = 0
    counter2 = 0

    if ((c in s) for c in chars1):
        counter1 += 1
    elif ((c in s) for c in chars2):
        counter2 += 1
    print(str(counter2) + "/" + str(counter1))

error_printer(string_1)

Tags: 字符串in密码forstring计数器error字符
3条回答

尝试使用if条件递增,在s上使用一个循环

for c in s:
    if c in char1:
        counter1 += 1
    if c in char2:
        counter2 += 1

for循环的另一种选择:

string_1 = "aaabbbbhaijjjm"

def error_printer(s):
    chars1 = "abcdefghijklm"
    chars2 = "nopqrstuvwxyz"

    counter1 = sum(s.count(c) for c in chars1)
    counter2 = sum(s.count(c) for c in chars2)

    print(str(counter2) + "/" + str(counter1))

error_printer(string_1)

在这里您可以计算出"a""b""c"的次数。。。在字符串输入中显示,然后对其进行总结。

它仍然是低效的,但是利用了string.countsum函数,使它更容易阅读和理解正在发生的事情。

chars1/chars2中出现在s中的字符数

这是有意义的,因为你在if条件下会增加。因为if而不是在一个循环中,所以可以增加一次。

现在我们可以将生成器展开成一个for循环。这将解决问题的一部分,并生成0/6

for c in chars1:
    if c in s:
        counter1 += 1for c in chars2:
    if c in s:
        counter2 += 1

然而,这仍然不是非常有效:它需要O(n)最坏的情况来检查字符是否在字符串中。您可以先用字符串中的字符构造一个set,然后执行查找(一般情况下为O(1)

def error_printer(s):
    sset = set(s)
    chars1 = "abcdefghijklm"
    chars2 = "nopqrstuvwxyz"
    counter1 = 0
    counter2 = 0
    for c in chars1:
        if c in sset:
            counter1 += 1
    for c in chars2:
        if c in sset:
            counter2 += 1
    print(str(counter2) + "/" + str(counter1))

现在我们已经提高了效率,但是它仍然不是很优雅:它需要大量的代码,而且必须检查代码才能知道它的功能。我们可以使用sum(..)构造来计算满足特定约束的元素数,如:

def error_printer(s):
    sset = set(s)
    chars1 = "abcdefghijklm"
    chars2 = "nopqrstuvwxyz"
    counter1 = sum(c in sset for c in chars1)
    counter2 = sum(c in sset for c in chars2)
    print(str(counter2) + "/" + str(counter1))

这会产生0/6,因为[A-M]范围中有6个字符出现在s中,而[N-Z]范围中有0个字符出现在s中。

s中出现在char1/char2中的字符数

但是,根据问题的主体,您希望计算出现在两个不同范围内的s中的字符数。

另一个相关的问题是计算出现在char1/char2中的字符数。在这种情况下,我们只需交换循环:

def error_printer(s):
    chars1 = set("abcdefghijklm")
    chars2 = set("nopqrstuvwxyz")
    counter1 = sum(c in chars1 for c in s)
    counter2 = sum(c in chars2 for c in s)
    print(str(counter2) + "/" + str(counter1))

这会产生0/14,因为s中有14个字符出现在[A-M]范围内(如果'a's中出现两次,则我们将其计数两次),并且s中的任何字符都不会出现在[N-Z]范围内。

使用范围检查

由于我们使用的是范围,因此可以使用比较而不是元素检查,并使其与两个比较检查一起运行,例如:

def error_printer(s):
    counter1 = sum('a' <= c <= 'm' for c in s)
    counter2 = sum('n' <= c <= 'z' for c in s)
    print(str(counter2) + "/" + str(counter1))

相关问题 更多 >