1

私は一般的にPythonとプログラミングにまったく慣れておらず、現在Grok Onlineでオンラインコースを行っています。現在、私は 2 番目のコース (Robots in a line!) で立ち往生しています。簡単な説明は、1 行のテキストを読み取り、ロボットという単語が表示されるかどうかを出力するプログラムを設計することですが、単語が小文字かどうかを判断する必要があります。 、大文字または大/小文字混合。これまでの私の解決策は次のとおりです。

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.')

もう 1 つのことは、プログラムは単語を個々の文字列として区別する必要があるため、'robot' の場合は True を出力し、'strobotron' の場合は false を出力することです。

4

5 に答える 5

1

この問題を解決するには多くの方法があります。正規表現はツールの 1 つです。これが 2 番目のプログラミング コースであることを考えると、正規表現に反対することをお勧めします。代わりに、より基本的な Python ツールと概念を使用してみます。

最初に文字列を空白で分割します。

words = text.split()

これにより、文字列'I am a robot'が単語のリストに分割されます: ['I', 'am', 'a', 'robot']. これは句読点を分割しないことに注意してください。'I am a robot.'になり['I', 'am', 'a', 'robot.']ます。末尾のドットに注意してください'robot.'。回答の残りの部分では、句読点がないふりをします。これは、2 番目のプログラミング コースの範囲を超えて問題を複雑にするためです。

大文字と小文字を区別せずに を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:) は、暗黙のブール値と呼ばれる Python のメカニズムを使用しています。このような if 条件ではほとんど何でも使用でき、暗黙的にブール値に変換されます。ほとんどの場合、事物が「空」である場合、それは false と見なされます。

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を使用すると、小型ロボットが見つかった場合に中型ロボットをスキップしません。

おまけ: 並んでいる小型ロボットが 1 つ以上あるかどうかを区別することもできます。

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 に答える
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.
于 2015-02-19T06:44:35.150 に答える
1

これは句読点を処理し、ストロボトロンの一致も回避します。

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 に答える
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 に答える