python - 试图在同一个字符串中找到相等数量的字符

我想看看一个字符串是否有相同数量的 'x's 和 'o's。该方法必须返回一个布尔值并且不区分大小写。字符串可以包含任何字符。

示例输入/输出:

XO("xooxx") => false
XO("ooxXm") => true
XO("zpzpzpp") => true // when no 'x' and 'o' is present should return true
XO("zzoo") => false

所以我尝试创建新列表,然后为每个“x”和每个“o”创建 append,但它不太有效。到目前为止,这是我的代码:

def xo(s):
    ex = []
    oh = []
    for letter in s.split():
        if letter.islower() == 'x':
            ex = ex.append(letter)
        elif letter.islower() == 'o':
            oh = oh.append(letter)
    if len(ex) == len(oh):
        return True
    else:
        return False

它只在第一个上返回 True,但在最后三分之一上不返回。在我看来,代码没有正确附加。

回答1

您的代码中有(至少)三个问题:

  • s.split() 在每个空格上拆分 s 并返回一个列表(因此假设您没有空格,这将为您提供一个包含单个项目的列表)。相反,只需使用迭代每个字母的 for letter in s:
  • letter.islower() 检查字母是否为小写,返回 TrueFalse。你想要的是 letter.lower() 它返回一个字符的小写版本。
  • 另外(感谢 Mark)append 不会返回 value,因此当您运行 oh = oh.append(letter) 时,您会将 None 的 value 分配给 oh 变量。您应该只使用 oh.append(letter) (没有分配)。

回答2

只需使用 collections.Counter

>>> from collections import Counter
>>> c = Counter('xooxXo'.lower())
>>> c['x'] == c['o']
True

或者

>>> c = Counter('xooxx'.lower())
>>> c['x'] == c['o']
False

如果您愿意,可以将其包装在您自己的函数中。

回答3

大卫的回答涵盖了对您的代码的一些潜在修复,但如果您正在寻找更简洁的东西,我建议您使用 .lower() 预先将字符串小写,然后使用 .count() 来计算 Xs 和 Os 的数量,而不是使用 for 循环:

def xo(s):
    return s.lower().count('x') == s.lower().count('o')

这输出:

False

相似文章

最新文章