質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1166閲覧

Pythonコードのelse部のエラーの理由およびコードの意味を教えてください。

HRDNOHS

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/08/12 13:08

編集2018/08/12 13:12

前提・実現したいこと

Googleの公開している以下のプログラミング課題のサンプルコードがうまく動作せず、また一部ソースコードの意味がわからず困っています。素人質問で恐縮ですが、どなたか教えてください。

■課題のリンク先

https://techdevguide.withgoogle.com/paths/foundational/find-longest-word-in-dictionary-that-subsequence-of-given-string#!

課題の内容は文字列といくつかの単語のリストが与えられ、単語のリストの中で、すべての文字が文字列の中に順番どおりに含まれる単語の中で最長の単語を表示するプログラムです。

発生している問題・エラーメッセージ

上記課題のリンク先にあるコード例をコピーペーストすると、21行目のelse文にてエラーが発生します。

E0001:invalid syntax (<string>, line 34)

該当のソースコード

Python

1#!/usr/bin/env python 2import collections 3import sys 4def find_longest_word_in_string(letters, words): 5 letter_positions = collections.defaultdict(list) 6 7 for index, letter in enumerate(letters): 8 letter_positions[letter].append(index) 9 10 for word in sorted(words, key=lambda w: len(w), reverse=True): 11 pos = 0 12 for letter in word: 13 if letter not in letter_positions: 14 break 15 16 possible_positions = [p for p in letter_positions[letter] if p >= pos] 17 if not possible_positions: 18 break 19 pos = possible_positions[0] + 1 20 else: 21 return word 22 23if __name__ == '__main__': 24 print subdict(sys.argv[1], sys.argv[2:])

試したこと

上から順にコードを読んで行って修正を試みているのですが、以下の二点がわからず、止まっております。この箇所以前については個別に動かして正しく動作していることを確認しました。
1,16行目のpossible_positions = ~の行で何をしているのか意味がわからず、その後が理解できません。
2,以下の部分で何をしているのかよくわかりません。
if name == 'main':
print subdict(sys.argv[1], sys.argv[2:])

補足情報(FW/ツールのバージョンなど)

Python3.6.5(Anaconda3)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/08/12 13:32

これはその記事の執筆者のミスですから、どうにかしてgoogleに連絡して修正してもらった方が良いでしょう
HRDNOHS

2018/08/12 14:00

ご指摘ありがとうございます。どうしたら動くようになるのか自分で理解しておきたく質問いたしました。
guest

回答2

0

ベストアンサー

プログラムが動作するようにしてみました。word を変化させたら、結果もそれなりに変化することも確認できます。

python

1#!/usr/bin/env python 2import collections 3import sys 4 5def find_longest_word_in_string(letters, words): 6 letter_positions = collections.defaultdict(list) 7 for index, letter in enumerate(letters): 8 letter_positions[letter].append(index) 9 10 for word in sorted(words, key=lambda w: len(w), reverse=True): 11 pos = 0 12 for letter in word: 13 if letter not in letter_positions: 14 break 15 16 possible_positions = [p for p in letter_positions[letter] if p >= pos] 17 if not possible_positions: 18 break 19 pos = possible_positions[0] + 1 20 else: 21 return word 22 23 24if __name__ == '__main__': 25 # print(find_longest_word_in_string(sys.argv[1], sys.argv[2:])) 26 letters = "abppplee" 27 words = ["able", "ale", "apple", "bale", "kangaroo"] 28 print(find_longest_word_in_string(letters, words)) 29 30 words = ["able", "ale", "applex", "bale", "kangaroo"] 31 print(find_longest_word_in_string(letters, words)) 32 33 words = ["ablex", "ale", "applex", "bale", "kangaroo"] 34 print(find_longest_word_in_string(letters, words)) 35 36 words = ["ablex", "alex", "applex", "bale", "kangaroo"] 37 print(find_longest_word_in_string(letters, words)) 38

実行例
イメージ説明

参考

  • else節とbreak文

http://programming-study.com/technology/python-break/

...
Pythonのfor文およびwhile文にはif文と同様にelse節が用意されています。ループ文のelse節は、その繰り返しが正しく終了する場合に実行されます。
...

投稿2018/08/13 04:25

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HRDNOHS

2018/08/13 06:22

ありがとうございます。理解できました。
guest

0

エラーの原因は、インデントがおかしいことです。
まず、Pythonの文法の勉強をしましょう。

2,以下の部分で何をしているのかよくわかりません。

これは、入門書を読んだだけでは分からないかも知れないので、説明します。
このファイルを直接実行したときにはifが成立してその下が実行されて、他のプログラムからimportされた場合にはifが成立せずに実行されません。__name__ とは何なのかを調べると仕組みが分かるかと。

投稿2018/08/12 13:44

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HRDNOHS

2018/08/12 13:59

回答ありがとうございます。インデントがおかしいというのは以下の箇所でしょうか? if not possible_positions: break pos = possible_positions[0] + 1 else: return word 上記箇所はsorted wordに対するfor文の中でbreakしないwordを返すのかなと思っていたのですが(正確には理解できていません)、letter in wordに対するfor文に含むべき箇所ということですか?
otn

2018/08/12 14:02

if構造のインデントがおかしいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問