この問題を解決するには多くの方法があります。正規表現はツールの 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.')