1

总的来说,我对 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.')

另一件事是程序必须将单词区分为单独的字符串,因此它会为“robot”打印 True,而为“strobotron”打印 false。

4

5 回答 5

1

你的第二个elif陈述应该是

elif 'robot' in text.islower() and not ('ROBOT' in text or 'robot' in text):

如果您想在一行中完成所有这些操作。

对于第二个要求,您可以使用正则表达式单词边界锚点

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.')
于 2015-02-19T06:38:51.563 回答
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.
于 2015-02-19T06:44:35.150 回答
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.')
于 2015-02-19T06:44:46.867 回答
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'。这解决了 find'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:) 是使用称为隐式布尔值的 Python 机制。几乎任何东西都可以在这样的 if 条件中使用,并且它将被隐式转换为布尔值。在大多数情况下,如果这个东西是“空的”,它就会被认为是假的。

注意 if else 链中条件的顺序。您必须先检查一个空列表,否则 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.')
于 2015-02-19T06:48:51.387 回答
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}
于 2015-02-19T07:54:48.257 回答