试图在同一字符串中找到相同数量的字符

Trying to find equal amount of characters in same string

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

示例input/output:

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

所以我尝试制作新列表,然后为每个 'x' 和每个 'o' 追加,但它不太有效。到目前为止,这是我的代码:

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

只有前一个 return 正确,后三分之一不正确。在我看来,代码没有正确附加。

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

  • s.split() 在每个 space 和 return 上拆分 s 一个列表(所以假设你没有 spaces,这给你一个列表单个项目)。相反,只需使用 for letter in s: 遍历每个字母。
  • letter.islower() 检查字母是否小写,returning TrueFalse。您想要的是 letter.lower(),其中 return 是字符的小写版本。
  • 此外(感谢 Mark)追加没有 return 值,因此当您 运行 oh = oh.append(letter) 时,您将 None 的值分配给 oh 变量。您应该改为只使用 oh.append(letter)(无赋值)。

只需使用collections.Counter

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

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

如果需要,将其包装在您自己的函数中。

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

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

这输出:

False