我想看看一个字符串是否有相同数量的 '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()
检查字母是否为小写,返回True
或False
。你想要的是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