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

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

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

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

Python

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

Q&A

解決済

3回答

1244閲覧

リスト中にないデータの回数が表示される

Shoan

総合スコア13

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2017/11/13 19:32

###前提・実現したいこと
学校のプロジェクトで、生徒の専攻一覧が書いてるテキストファイルから出現回数をカウントし、簡易的な表にして返すというコードを書いています。
テキストファイル(majors_cis210f17.txt)の内容は以下の通りです。
CIS CAS
EC CAS
PS CAS
GSS CAS
PBA BUS
SDSC CAS
CIS CAS
CIS CAS
MATH CAS
CIS CAS
CIS CAS
PSY CAS
CIS CAS
GSS CAS
PDS CAS
CIS CAS
CIS CAS
PS CAS
CIS CAS
CIS CAS
PHYS CAS
CIS CAS
UNDL N/A
ATCH AAA
CIS CAS
PHYS CAS
UNDL N/A
CIS CAS
CIS CAS
EC CAS
PBA BUS
EC CAS
CIS CAS
PEN CAS
CIS CAS
MATH CAS
CEP N/A
CIS CAS
CIS CAS
BI CAS
CIS CAS
MACS CAS
GEOG CAS
MATH CAS
UNDL N/A
CIS CAS
PEN CAS
UNDL N/A
CIS CAS
UNDL N/A
CIS CAS
MUS MUS
UNDL N/A
MACS CAS
CIS CAS
CIS CAS
CH CAS
CIS CAS
CIS CAS
CIS CAS
CH CAS
CIS CAS
CIS CAS
CIS CAS
CIS CAS
UNDL N/A
GEOG CAS
CIS CAS
CIS CAS
CIS CAS
CIS CAS
MATH CAS
MATH CAS
PEN CAS
PBA BUS
ATCH AAA
CIS CAS
CIS CAS
PHYS CAS
MACS CAS
UNDL N/A
CIS CAS
CIS CAS
UNDL N/A
MATH CAS
CIS CAS
CIS CAS
UNDL N/A
PBA BUS
CIS CAS
MACS CAS
CIS CAS
J JOURN
CIS CAS
BI CAS
MATH CAS
UNDL N/A
EC CAS
CIS CAS
BI CAS
EC CAS
MATH CAS
CIS CAS
MATH CAS
MATH CAS
CIS CAS
CIS CAS
UNDL N/A
MATH CAS
CIS CAS
MUS MUS
PBA BUS
PS CAS
CIS CAS
CIS CAS
CIS CAS
UNDL N/A
CIS CAS
PBA BUS
HPHY CAS
UNDL N/A
ACTG BUS
CEP N/A
CIS CAS
CIS CAS
CIS CAS
CIS CAS
PHYS CAS
CIS CAS
CIS CAS
MATH CAS
MACS CAS
UNDL N/A
CIS CAS
CIS CAS
CIS CAS
UNDL N/A
CIS CAS
ERTH CAS
CIS CAS
CIS CAS
CIS CAS
CIS CAS
MATH CAS
CIS CAS
PBA BUS
UNDL N/A
UNDL N/A
CIS CAS
PHYS CAS
BI CAS
CIS CAS
UNDL N/A
CH CAS
CIS CAS
EC CAS
CIS CAS
MATH CAS
UNDL CAS
CIS CAS
GS CAS
UNDL N/A
UNDL N/A
UNDL N/A
MATH CAS
PSY CAS
UNDL N/A
CIS CAS
CIS CAS
UNDL N/A
CIS CAS
CIS CAS
UNDL N/A
CIS CAS

majors_readfでデータの読み込みをし、最初の部分のみをリストにして返します。
majors_analysisで他のファイルからのdefを使いリストのなかでどの専攻が一番多かったを返します。
majors_reportでは一番多かった専攻の結果を表示するのと、簡易的な表(専攻とその出現回数)を表示します。
###発生している問題・エラーメッセージ
majors_reportの結果にデータにない専攻が表示されてしまいます。

Most represented major(s) ['CIS'] ITEM : FREQUENCY {'ACTG': 78, 'ATCH': 6, 'BI': 3, 'CEP': 2, 'CH': 7, 'CIS': 1, 'EC': 15, 'ERTH': 2, 'GEOG': 1, 'GS': 5, 'GSS': 26, 'HPHY': 2, 'J': 3, 'MACS': 2, 'MATH': 4, 'MUS': 5, 'PBA': 2, 'PDS': 2, 'PEN': 3, 'PHYS': 1, 'PS': 1, 'PSY': 1, 'SDSC': 1, 'UNDL': 1} None

###該当のソースコード

import pprint import os from p62_data_analysis import mode,genFrequencyTable,frequencyTable def majors_readf(fname): with open(fname,'r') as data: major_list = [major.split()[0] for major in data] return major_list def majors_analysis(majorsli): frequent_value = mode(majorsli) return frequent_value def majors_report(majors_mode, majorsli): most_represented = majors_analysis(majorsli) print('Most represented major(s)',most_represented) table = frequencyTable(majorsli) print(table) return None def main(): fname = 'majors_cis210f17.txt' majorsli = majors_readf(fname) majors_mode = majors_analysis(majorsli) return majors_mode

他ファイルからのdefは以下になります。

def mode(alist):   countdict = {} for item in alist: if item in countdict: countdict[item] = countdict[item] + 1 else: countdict[item] = 1 countlist = countdict.values() maxcount = max(countlist) modelist = [] for item in countdict: if countdict[item] == maxcount: modelist.append(item) return modelist def genFrequencyTable(alist): countdict = {} for item in alist: if item in countdict: countdict[item] = countdict[item] + 1 else: countdict[item] = 1 itemlist = list(countdict.keys()) itemlist.sort() dictionary = dict(zip(itemlist,countdict.values())) return dictionary def frequencyTable(alist):   print("ITEM",":","FREQUENCY") pprint.pprint(genFrequencyTable(alist), width = 1)

###補足情報(言語/FW/ツール等のバージョンなど)
main()は最後に書くつもりなので、最終的なものではありません。ご指摘よろしくお願いいたします。

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

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

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

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

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

wakame

2017/11/13 21:43

majors_reportの結果にデータにない専攻が表示されてしまいますというのはどれのことを指しますか?
Shoan

2017/11/13 21:51

ACTGなどです。回数的にCISの回数が一番多いはずが、リストにない言葉の出現回数が一番多いと返されました。
wakame

2017/11/13 22:12

回答に記述しました結果になってほしいということですか?
Shoan

2017/11/13 22:13

その通りです。
guest

回答3

0

ベストアンサー

こういうことでしょうか?

Python

1from collections import Counter, OrderedDict 2import json 3 4# Read file 5with open('data.txt') as f: 6 counter = Counter([line.split()[0] for line in f]) 7 8# Make fruquency dictionary 9fruqency_dict = OrderedDict() 10for k, v in counter.most_common(): 11 fruqency_dict[k] = v 12 13# Output result 14print('Most represented major(s) [{}]'.format(list(fruqency_dict.keys())[0])) 15print('ITEM : FRUQUENCY') 16print(json.dumps(fruqency_dict, indent=4))

実行結果

Most represented major(s) [CIS] ITEM : FRUQUENCY { "CIS": 78, "UNDL": 26, "MATH": 15, "PBA": 7, "EC": 6, "PHYS": 5, "MACS": 5, "BI": 4, "PS": 3, "PEN": 3, "CH": 3, "GSS": 2, "PSY": 2, "ATCH": 2, "CEP": 2, "GEOG": 2, "MUS": 2, "SDSC": 1, "PDS": 1, "J": 1, "HPHY": 1, "ACTG": 1, "ERTH": 1, "GS": 1 }

コメントを受けて

ヒントだけ。

Python

1>>> from collections import OrderedDict 2>>> 3>>> hoge = {'foo': 4, 'bar': 6, 'foobar': 7} 4>>> sorted_hoge = OrderedDict() 5>>> for k, v in sorted(hoge.items(), key=lambda x: x[1], reverse=True): 6... sorted_hoge[k] = v 7... 8>>> print(sorted_hoge) 9OrderedDict([('foobar', 7), ('bar', 6), ('foo', 4)])

dictのビューに比べ、OrderedDictのビューは一定の順序を保証します。
平たく言うと、.items().keys().values()による値が挿入順になるということです。

適宜リファレンスを見て、理解を深めるようにしてください。
Python 標準ライブラリ » 組み込み関数 » sorted
Python 標準ライブラリ » データ型 » collections » OrderedDict

投稿2017/11/14 05:07

編集2017/11/14 06:37
LouiS0616

総合スコア35658

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

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

Shoan

2017/11/14 05:47

defが宿題の関係で指定されています。genFrequencyTableの中を修正していただくことは可能ですか?
LouiS0616

2017/11/14 06:09 編集

Pythonの組み込みの辞書は、順序を記憶できません。 ですので、genFrequencyTableの戻り値の型が辞書である限りは、そのような修正は不可能です。
LouiS0616

2017/11/14 06:06

ここのあたりのインターフェースをいじっていいなら別ですが。
Shoan

2017/11/14 06:18

戻り値を変更して修正していただけますか?
LouiS0616

2017/11/14 06:38

ヒントを追記しました。
wakame

2017/11/14 08:02

defが宿題の関係で指定されています。それを最初に知りたかったです。それを知っていたら自分の回答もだいぶ変わってきたと思います。また、質問に対してコードをスッキリ書いたつもりなのでなんで解決にならないのだろうとヤキモキしてたのがやっとスッキリしました。
Shoan

2017/11/14 08:07

すみませんでした。ご回答ありがとうございました。
guest

0

genFrequencyTable関数の中でcountdict.values()がsortされていないので、zipする際に対応がとれておらず、keyとfreaqencyがばらばらになっています。

python

1def genFrequencyTable(alist): 2 countdict = {} 3 for item in alist: 4 if item in countdict: 5 countdict[item] = countdict[item] + 1 6 else: 7 countdict[item] = 1 8 itemlist = list(countdict.keys()) 9 itemlist.sort() 10 #修正 11 #dictionary = dict(zip(itemlist,countdict.values())) 12 dictionary = dict((item,countdict[item]) for item in itemlist) 13 return dictionary

また、wakameさんが使われているCounterを使えば大半の処理はそちらで対応可能と思います。

投稿2017/11/13 23:51

y__sama

総合スコア83

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

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

Shoan

2017/11/14 04:17

すみません、ご回答いただいたとおりにしたのですが、変わらず同じ間違ったデータが結果としてでてしまいます。
y__sama

2017/11/14 06:40 編集

間違ったデータとはどれのことでしょうか? ACTGは元のデータに1レコード入っているので、ACTG:1という出力は正しいデータだと思います。 元の`genFrequencyTable`でキーでソートをかけていたので、キーの文字列順に出力しましたが、質問にない条件(頻出順にソートして出力など)があるということでしょうか?
LouiS0616

2017/11/14 06:46

どんなにソートしようが、組み込みのdictに放り込んだ時点で順序は保証されません。
LouiS0616

2017/11/14 07:18

失礼しました、3.6以降は順序が保証されるのですね。 『バージョン依存であるから』という理由での指摘ではないので、完全に私が無知でした。
LouiS0616

2017/11/14 07:26

ただし、3.6.0で実行してみたところ、やはり組み込みのdictでは想定通りの結果にはならないようです。 これはなんでなんでしょうね...
y__sama

2017/11/14 07:27

いえ、たとえばpprintなどでどうなるかなどは私も未検証ですし、汎用の回答を提供した方がよいと思いますので、指摘はありがたかったです。 やはりOrderedDictを使うか、dictをlistなどにして出力するのが王道だと思います。
LouiS0616

2017/11/14 07:47

printでは正しく表示されそうです。 ただし、y__samaさんの回答ではカウンターのキーをソートしてしまっているので、そこだけ修正する必要がありました。
can110

2017/11/14 07:53

横から失礼します。 pep468では「キーワード引数の順序が言語仕様として保証された」という内容で 合わせて「dictも順序保証されるようになった」と記載されていますが、言語仕様としてではなく実装(CPython)依存です。このあたりややこしいのですが、shimizukawaさんが非常にうまくまとめられています。 http://www.freia.jp/taka/blog/python3-hash-randomie/index.html
LouiS0616

2017/11/14 08:12

なるほど... ご教示ありがとうございます。
y__sama

2017/11/14 23:41

can110さん  ありがとうございます。非常に丁寧な参考URLで助かります。 私のバージョン依存という表現も不正確で、CPython3.6実装依存が正しい表現ですね。
guest

0

txt自体がおかしいのではと思い以下のコードで出現頻度を確かめました。
txt自体に問題ないことはわかりました。

python

1import pandas as pd 2from collections import Counter 3from pprint import pprint 4 5data = pd.read_csv('a.txt', sep=" ", header=None) 6data.columns = ["a", "b"] 7frequency = Counter(data["a"]) 8pprint(frequency) 9""" 10Counter({'CIS': 78, 11 'UNDL': 26, 12 'MATH': 15, 13 'PBA': 7, 14 'EC': 6, 15 'PHYS': 5, 16 'MACS': 5, 17 'BI': 4, 18 'CH': 3, 19 'PEN': 3, 20 'PS': 3, 21 'CEP': 2, 22 'MUS': 2, 23 'GEOG': 2, 24 'GSS': 2, 25 'ATCH': 2, 26 'PSY': 2, 27 'HPHY': 1, 28 'GS': 1, 29 'ACTG': 1, 30 'PDS': 1, 31 'ERTH': 1, 32 'J': 1, 33 'SDSC': 1}) 34"""

投稿2017/11/13 22:07

wakame

総合スコア1170

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問