教科書の問題で、リストの中に含まれるカテゴリーの数を数えるコードを書いています。
下記は正しく動作するコードになります。
def histogram(data):
result=[]
for i in range (len(data)):
put_item(result,data[i])
return result
def put_item(res,item):
for i in range (len(res)):
if res[i][0] == item:
res[i][1] = res[i][1]+1
return
res.append([item,1])
data = ['cat','dog','cat','cat','car','dog','car','cat','cow','cat']
histogram(data)
結果→
[['cat', 5], ['dog', 2], ['car', 2], ['cow', 1]]
練習のため、他の書き方も試しているのですが、下記のコードではうまく動作しません。
data = ['cat','dog','cat','cat','car','dog','car','cat','cow','cat']
result=[]
for i in range (len(data)):
for p in range (len(result)):
if result[p][0] == data[i]:
result[p][1] = result[p][1]+1
break
result.append([data[i],1])
print(result)
結果→
[['cat', 5], ['dog', 1], ['cat', 1], ['cat', 1], ['car', 1], ['dog', 1], ['car', 1], ['cat', 1], ['cow', 1], ['cat', 1]]
breakでリストの追加を止めているつもりなのですが、正しく動作しないのはなぜでしょうか。
宜しくお願い致します。
No.2
- 回答日時:
下のコードだと result[p][0] == data[i] が成り立っても result.append([data[i],1]) は処理しちゃうよ.
とはいえ, 本当にその結果になっているんだとしたらインデントもおかしい気がする. break が if の制御を受けていないような感じ.
ご回答ありがとうございます。
実行結果ですが、
[['cat', 5], ['dog', 2], ['cat', 1], ['cat', 1], ['car', 2], ['dog', 1], ['car', 1], ['cat', 1], ['cow', 1], ['cat', 1]]
でした、失礼しました。
最初のコードの様に関数としてまとめてreturnにすれば処理を中止してくれるのと同じことをbreakでしたいのですが。
インデントはずらして動作確認しましたが、うまくいきませんでした。
breakなしで動かすと、
[['cat', 5], ['dog', 2], ['cat', 4], ['cat', 3], ['car', 2], ['dog', 1], ['car', 1], ['cat', 2], ['cow', 1], ['cat', 1]]
という結果になります。
No.3
- 回答日時:
問題は該当項目があって数量加算した際に、加算した事を次に教えないからbreakしても追加をしちゃうんじゃないの?
だからそのチェック体制をすればよいかと思います。
data = ['cat','dog','cat','cat','car','dog','car','cat','cow','cat']
result=[]
for i in range (len(data)):
ch = False
for p in range (len(result)):
if result[p][0] == data[i]:
result[p][1] = result[p][1]+1
ch = True
break
if ch == False:result.append([data[i],1])
print(result)
結果:
[['cat', 5], ['dog', 2], ['car', 2], ['cow', 1]]
ご回答ありがとうございます。
返信遅れてすみません。
他の方にelseを使ったコードを教えて頂いてそれが分かりやすかったと思いましたが、なるほどチェック体制をつくるという代替案もあるのですね。私の知識でも書けたはずなだけに、とても勉強になりました。
No.4
- 回答日時:
breakは一番内側のループしか抜けません。
なのでresult.append([data[i],1])
の部分は内側のループをbreakで抜けても実行されてしまいます。
関数で書いている方はループの中でreturnしているのでループの後のappendもスキップされていますね。
Pythonの場合はループにもelse節を使えて、これはbreakした場合は実行されないので下記のようにappendを内側ループのelse節で実行すれば所望の動作になります。
data = ['cat','dog','cat','cat','car','dog','car','cat','cow','cat']
result=[]
for i in range (len(data)):
for p in range (len(result)):
if result[p][0] == data[i]:
result[p][1] = result[p][1]+1
break
else:
result.append([data[i],1])
print(result)
いつもありがとうございます。返信遅れてすみません。
このコードが今の自分には一番しっくり来ました。
elseはifとセットという固定概念があったので、elseの使い方について勉強になりました。引き続きよろしくお願い致します。
No.6ベストアンサー
- 回答日時:
result.append([data[i],1])は break にかかわらず走るから
当たり前だよね。
それと、なにがなんでも配列で、検索は力任せのリニアサーチ
というのは 全然 pythonらしくない(^^;
辞書型の検索機能を使うとこんな感じです。
data = ['cat','dog','cat','cat','car','dog','car','cat','cow','cat']
result = {}
for d in data:
result[d] = result.setdefault(d, 0) + 1
print(result)
setdefault メソッドは辞書にキーが存在するかチェックし、
なければキー値ペアを辞書内に作成してその値を返すメソッドです。
collections.defaultdict(キー参照時、キーが無い場合自動的にキー値ペアを作成する辞書) を
使えばさらに読みやすいコードになります。
import collections
data = ['cat','dog','cat','cat','car','dog','car','cat','cow','cat']
result = collections.defaultdict(lambda: 0)
for d in data:
result[d] = result[d] + 1
print(result)
ご回答ありがとうございます。返信遅れてすみません。
とてもエレガントなコード教えて頂きありがとうございます。
Pythonらしいコードというものが何となくイメージできました。
練習のためアナログなやり方でコードを書く練習をしているのですが、Pythonの機能を使ってよりシンプルなコードを書けるようになりたいので、とても勉強になりました。これからも是非教えて下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- UNIX・Linux Ubuntuサーバーでメールを受信できない 7 2022/08/23 20:55
- 英語 「あっ トイレにネコがいます」の英訳 3 2022/08/25 22:15
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- UNIX・Linux Linuxの実行結果を修正したいです。 2 2022/11/23 08:32
- その他(プログラミング・Web制作) ColabでのPytorchのエラー 1 2022/11/19 20:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
構造体のソートの方法について...
-
pythonでDBのカラム名で取得し...
-
linuxのシェルでファイル名に先...
-
H8/36064を使ったシリアル通信...
-
テキストファイルの結合について
-
C言語の構造体にてバブルソート...
-
c言語 配列から数字だけをint型...
-
int型(2バイト)データの分割
-
関数マクロの書き方
-
C言語 ファイル内のデータと入...
-
c言語での wavファイルの編集(...
-
【Excel VBA】10進数を2進数に...
-
C言語 構造体の名前欄?を小文...
-
C言語の勉強しています。すみま...
-
C#でのswitch文
-
'dataType' 引数を Null にする...
-
PICNICのVB制御プログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
int型(2バイト)データの分割
-
c言語の多次元配列で1から100ま...
-
C#でのswitch文
-
【Excel VBA】10進数を2進数に...
-
途中経過も表示するプログラム
-
CreateProcessでの環境変数の設...
-
pythonでDBのカラム名で取得し...
-
C言語についてです! 同じ年の...
-
linuxのシェルでファイル名に先...
-
c言語 配列から数字だけをint型...
-
c言語での wavファイルの編集(...
-
matlabのソースコードをpython...
-
ビットデータのチェック方法
-
10個の実数に対する降順ソート...
-
python 気象データの取得
-
C言語の構造体にてバブルソート...
おすすめ情報