我对python和编程很新,我目前正在Grok Online上进行在线课程。目前我被困在第二个课程(机器人在线!),因为简要的是设计一个程序,读取一行文字并打印出机器人是否出现,尽管它必须弄清楚这个单词是否是小写的,大写或混合大小写。这是我迄今为止的解决方案:
text = input('Line: ')
if 'robot' in text:
print('There is a small robot in the line.')
elif 'robot'.upper() in text:
print('There is a big robot in the line.')
elif 'robot' or 'ROBOT' != text.isupper() and not text.islower():
print('There is a medium sized robot in the line.')
else:
print('No robots here.')
另一件事是程序必须将单词区分为单个字符串,因此它会为'机器人'打印True,但对'strobotron'打印为false。
答案 0 :(得分:1)
您的第二个elif
声明应为
elif 'robot' in text.islower() and not ('ROBOT' in text or 'robot' in text):
如果你想在一行中完成所有这些。
对于第二个要求,您可以使用正则表达式word boundary anchors:
import re
if re.search(r"\brobot\b", text, flags=re.I):
if re.search(r"\brobot\b", text):
print('There is a small robot in the line.')
elif re.search(r"\bROBOT\b", text):
print('There is a big robot in the line.')
else:
print('There is a medium sized robot in the line.')
else:
print('No robots here.')
答案 1 :(得分:1)
我假设您的输入最多包含一个机器人字符串。
>>> def findrobot(text):
if 'robot' in text:
print('There is a small robot in the line.')
elif 'robot'.upper() in text:
print('There is a big robot in the line.')
elif re.search(r'(?i)robot', text):
if 'robot' not in text and 'ROBOT' not in text:
print('MIxed cased robot found')
else:
print('No robots here.')
>>> text = input('Line: ')
Line: robot
>>> findrobot(text)
There is a small robot in the line.
>>> text = input('Line: ')
Line: ROBOT
>>> findrobot(text)
There is a big robot in the line.
>>> text = input('Line: ')
Line: RobOt
>>> findrobot(text)
MIxed cased robot found
>>> text = input('Line: ')
Line: foo
>>> findrobot(text)
No robots here.
答案 2 :(得分:1)
这可以处理标点符号并避免匹配strobotron:
text = input('Line: ')
text = text.replace('.,?;:"', ' ')
words = text.split()
lowers = text.lower().split()
if 'robot' in words:
print('There is a small robot in the line.')
elif 'robot'.upper() in words:
print('There is a big robot in the line.')
elif 'robot' in lowers:
print('There is a medium sized robot in the line.')
else:
print('No robots here.')
答案 3 :(得分:1)
有很多方法可以解决这个问题。正则表达式是其中一种工具。考虑到这是你的第二个编程课程我建议不要使用正则表达式。相反,我会尝试使用更基本的python工具和概念。
首先将字符串拆分为空格:
words = text.split()
这会将字符串'I am a robot'
拆分为单词列表:['I', 'am', 'a', 'robot']
。请注意,这不会拆分标点符号。 'I am a robot.'
将成为['I', 'am', 'a', 'robot.']
。注意末尾的点'robot.'
。对于其余的答案,我会假装没有标点符号,因为这会使事情超出第二个编程课程的范围。
现在,您可以为words
过滤'robot'
,无论如何:
robots = []
for word in words:
if word.lower() == 'robot':
robots.append(word)
这个循环也可以这样写:
robots = [word for word in words if word.lower() == 'robot']
这称为列表推导,基本上只是一种简单的方法来编写一个循环,将列表中的某些项目收集到另一个列表中。如果你还没有学过列表理解,那么就忽略这部分。
从输入'I am a robot and you are a ROBOT and we are RoBoT but not strobotron'
开始,列表robots
将为['robot', 'ROBOT', 'RoBoT']
。 'strobotron'
不在列表中,因为它不等于'robot'
。这解决了找到'robot'
而不是'strobotron'
的问题。
如果robots
列表为空,那么您就知道根本没有机器人。如果它不是空的,那么你可以检查小型或大型或中型机器人。
if not robots:
print('No robots here.')
elif 'robot' in robots:
print('There is a small robot in the line.')
elif 'ROBOT' in robots:
print('There is a big robot in the line.')
else:
print('There is a medium sized robot in the line.')
第一个条件(if not robots:
)正在使用一种叫做隐式booleanes的python机制。几乎任何东西都可以在这样的if条件中使用,它将被隐式转换为布尔值。在大多数情况下,如果事情是"空"这将被视为虚假。
请注意if else链中条件的顺序。您必须首先检查空列表,否则其他部分将无法工作。逻辑如下:如果列表不为空并且列表中没有小型或大型机器人,则列表中的任何机器人必须是中等的。
您的问题描述存在歧义。如果线路中同时存在小型和大型(和中型)机器人,该怎么办?它应该同时报告吗?如果两者都在一致,则当前代码将仅报告小型机器人。这是因为它首先检查一个小机器人然后跳过其余的(这是elif
的语义)。
要报告小型和大型(和中型)机器人,您可以这样做:
smallrobots = []
largerobots = []
mediumrobots = []
for robot in robots:
if robot == 'robot':
smallrobots.append(robot)
elif robot == 'ROBOT':
largerobots.append(robot)
else:
mediumrobots.append(robot)
if not robots:
print('No robots here.')
if smallrobots:
print('There is a small robot in the line.')
if largerobots:
print('There is a big robot in the line.')
if mediumrobots:
print('There is a medium sized robot in the line.')
请注意,elif
现在只在循环内部。仅使用if
进行报告意味着如果找到小型机器人,它将不会跳过中型机器人。
额外奖励:您现在甚至可以区分出是否有一个或多个小型机器人:
if len(smallrobots) == 1:
print('There is a small robot in the line.')
elif len(smallrobots) > 1:
print('There are small robots in the line.')
答案 4 :(得分:0)
这是另一种使用python集合的方法
from collections import Counter
def get_words(text, line=""):
lower_case, upper_case = text.lower(), text.upper()
data = {'lower' : 0,'upper' : 0, 'mix' : 0}
cnt = Counter()
for word in line.split():
cnt[word]+=1
if cnt.has_key(lower_case):
data['lower'] = cnt[lower_case]
cnt.pop(lower_case)
if cnt.has_key(upper_case):
data['upper'] = cnt[upper_case]
cnt.pop(upper_case)
for x, y in cnt.iteritems():
if x.lower()==lower_case:
data['mix'] += y
return data
它为您提供了文本计数
get_words('robot', line="i am a robot with Robot who has a ROBOT")
结果:
{'lower': 1, 'mix': 1, 'upper': 1}