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

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

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

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

Python

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

Q&A

2回答

3120閲覧

結果のソート(降順)にならべかえる

rhkt55

総合スコア8

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/01/09 04:19

編集2018/01/09 07:33

python

1import fileinput 2import re 3import json 4from operator import itemgetter 5from matplotlib import pyplot as plt 6from matplotlib.font_manager import FontProperties 7 8def remove_markup(str): 9 str1 = re.sub(r"{{.*?}}", "", str) 10 str1 = re.sub(r"[[", "", str1) 11 str1 = re.sub(r"]]", "", str1) 12 str1 = re.sub(r"<a href=.*?>", "", str1) 13 str1 = re.sub(r"<ref[^>]*/>", "", str1) 14 str1 = re.sub(r"<ref[^>]*>.+</ref>", "", str1) 15 return str1 16 17 18if __name__ == '__main__': 19 docs = {} 20 for line in fileinput.input('-'): 21 obj = json.loads(line) 22 docs[obj['title']] = obj['text'] 23 for lines in docs[obj['title']].split('\t'): 24 removed_str = remove_markup(lines) 25 line_number = 0 #行数 26 allkanji = 0 27 line_number += 1 28 rkan = re.compile("[一-龥]") 29 foundkanji = rkan.findall(removed_str) 30 oneline_kanji = len(foundkanji) / len(lines) #漢字の割合 31 allkanji += oneline_kanji 32 per = round((allkanji / line_number) * 100, 1) 33 result = obj['title'], '\t', per, '%' 34 print(result)

print(result)をperの値を降順にしたもので表示したいです。
sort()やsorted()などを使ったのですがエラーしか出ませんでした

辞書にperというキーを追加してこのようにしました
data = sorted(docs.items(), key=lambda docs: docs['per'])

エラーはこのようなエラーです
File "kadai.py", line 49, in <module>
data = sorted(docs.items(), key=lambda docs: docs['per'])
File "kadai.py", line 49, in <lambda>
data = sorted(docs.items(), key=lambda docs: docs['per'])
TypeError: tuple indices must be integers or slices, not str

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

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

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

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

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

1ntegrale9

2018/01/09 07:13 編集

「sort()やsorted()などを使ったのですがエラーしか出ませんでした」とありますが、sort()やsorted()をどのように使ったのか、また発生したエラーメッセージを記載してもらえるでしょうか?
guest

回答2

0

sort以前にコードに構造的な問題が在りそうです。現状では”最後に処理した部分”に対応した単純な文字列しかresultには入りませんよね。

入力のセクション、文字数計数のセクション、sortと出力のセクション、この三つを完全分離してコードする事を考えるべきではないでしょうか。

投稿2018/01/09 07:48

KojiDoi

総合スコア13671

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

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

0

直接の回答ではありませんが、次のような流れでできます。

  • obj['title']perを一対として、リストなりに貯めておく
  • リストをソートし上位n個を抽出
  • 抽出リストから棒グラフを描画

概念コード

Python

1import numpy as np 2import matplotlib.pyplot as plt 3 4# 元データ (title, per) ×5個 5data = [('a',10),('b',20),('c',30),('d',40),('e',50)] 6 7# [1]=perの降順(reverse=True)にソート 8data = sorted( data, key=lambda x: x[1], reverse=True) 9print(data) 10 11# 先頭3個だけ 12data = data[:3] 13print(data) 14 15# 棒グラフ 16left = np.arange(len(data)) # x座標群 17height = [i[1] for i in data]# y座標群 18label = [i[0] for i in data] # ラベル群 = title 19plt.bar(left, height, tick_label=label, align='center') 20plt.show()

投稿2018/01/09 07:12

can110

総合スコア38262

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問