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

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

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

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

Q&A

解決済

3回答

349閲覧

単語のカウントのプログラムがなぜ期待通りに動かないか。

Gargantua

総合スコア17

Python 3.x

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

0グッド

0クリップ

投稿2017/07/26 19:26

###発生している問題・エラーメッセージ
単語をカウントするプログラム(https://paiza.jp/learning/word-count)
をpython3で書いていたのですが、期待通りに動きません。

リンクにもありますが下記のようなプログラムを書きたいです。

入力:半角スペースで区切られた長さNの文字列
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力:
単語、半角スペース、出現回数の順で1行に1単語で出現したすべての単語を、列に出現する順に出力

###該当のソースコード
入力
red green blue blue green blue

text=input().rstrip().split(' ') length=len(text) a=[[text[0],0]] for i in range(length): b=a for j in range(len(a)): if text[i]==a[j][0]: a[j][1]+=1 elif j==(len(a)-1) and b==a: a.append([text[i],1]) for i in range(len(a)): print(a[i][0],a[i][1])

出力
red 1
green 2
blue 3
green 1
blue 1

###試したこと
入力
red green blue blue green blue

text=input().rstrip().split(' ') length=len(text) a=[[text[0],0]] b=0 for i in range(length): c=b for j in range(len(a)): if text[i]==a[j][0]: a[j][1]+=1 b+=1 elif j==(len(a)-1) and c==b: a.append([text[i],1]) for i in range(len(a)): print(a[i][0],a[i][1])

出力
red 1
green 2
blue 3

このようにしたところ、期待通りに動きました。
自分の中では、この2つのプログラムは本質的に同じだと思うのですが、前者のほうはうまく動きません。

###補足情報(言語/FW/ツール等のバージョンなど)
paiza上のpython3を使用しています。
###前提・実現したいこと
勉強のために、問題のコードではなぜ期待通りの出力をしないか教えていただけないでしょうか。

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

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

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

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

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

guest

回答3

0

原因については、他の方の回答を見ていただくとして...
辞書型を使うと、もっと楽に綺麗に組めると思います。調べてみてください。

投稿2017/07/27 01:45

LouiS0616

総合スコア35660

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

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

0

Python Tutor で最初のコードを再現させてみました:
https://goo.gl/TXgKyJ

最初のコードは、 "green" がすでにリスト a にあることを見つけて(Tutorの46ステップ目) a
の中の "green" のカウントを1足しています(47ステップ目)。しかし、その後 j のfor文はそこで終わらずに回り続け、 a の末尾が "green" ではないために(50ステップ目)末尾に ['green', 1] を改めて追加してしまっています(51ステップ目)。

ということで、カウントを1足した時点で内側のforループは終了させるか、ifとelifがTrueにならないようにしなければいけません。2つめのコードは、if/elifがTrueにならないコードになっています。

投稿2017/07/26 22:50

shimizukawa

総合スコア1847

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

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

0

ベストアンサー

今週から Python のチュートリアルを読み始めているのですが、PHP と結構違う箇所が多くて、戸惑っています^^;

今回の件は、以下にあたると思います。

なぜ list ‘y’ を変更すると list ‘x’ も変更されるのですか?

b が a を参照しているので、b==a が常に成立してしまっています。
その為、a.append([text[i],1])が意図しないところで動いています。

python

1text=input().rstrip().split(' ') 2length=len(text) 3a=[[text[0],0]] 4for i in range(length): 5 b=a 6 for j in range(len(a)): 7 if text[i]==a[j][0]: 8 a[j][1]+=1 9 print('a:',a) 10 print('b:',b) 11 elif j==(len(a)-1) and b==a: 12 a.append([text[i],1]) 13for i in range(len(a)): 14 print(a[i][0],a[i][1])
a: [['red', 1]] b: [['red', 1]] a: [['red', 1], ['green', 1], ['blue', 2]] b: [['red', 1], ['green', 1], ['blue', 2]] a: [['red', 1], ['green', 2], ['blue', 2]] b: [['red', 1], ['green', 2], ['blue', 2]] a: [['red', 1], ['green', 2], ['blue', 3], ['green', 1]] b: [['red', 1], ['green', 2], ['blue', 3], ['green', 1]] red 1 green 2 blue 3 green 1 blue 1

この方針で解決するのであれば、breakを使うんじゃないかなぁ。

python

1text=input().rstrip().split(' ') 2length=len(text) 3a=[[text[0],0]] 4for i in range(length): 5 for j in range(len(a)): 6 if text[i]==a[j][0]: 7 a[j][1]+=1 8 break 9 elif j==(len(a)-1): 10 a.append([text[i],1]) 11for i in range(len(a)): 12 print(a[i][0],a[i][1])

投稿2017/07/26 22:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問