🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

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

Q&A

解決済

3回答

2616閲覧

Python 同率順位の出力を実現したい

slushii

総合スコア19

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2020/12/19 06:45

編集2020/12/19 10:56

入力されたテキストのリストから、頻度上位10位までの単語とその出現回数を辞書型で出力したいです。
以下のコードでは、上から順番に10単語を出力することはできていますが、同率順位を考慮できていません。
例えば、頻度9位の単語が同率で5単語存在する場合(8位までは同率なし)は、1位から同率9位までの13単語を出力したいです。
よろしくお願いいたします。

Python

1def top_ten(list_txt): 2 list_lower = [] 3 for w in list_txt: 4 list_lower.append(w.lower()) 5 a_dict = dict((i, list_lower.count(i)) for i in list_lower) 6 a_tp = sorted(a_dict.items(), key=lambda x:x[1], reverse=True) 7 del a_tp[10:] 8 a_dict = dict(a_tp) 9 10 return a_dict 11

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

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

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

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

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

ppaul

2020/12/19 08:31

1位の10単語と2位以降の単語を全て出力したい ということは、200個の単語があって、10個の単語は10回づつ現れ、残りの100個が全て違う単語のときには、110個の要素を持つ辞書を作りたいと言っていますか?
slushii

2020/12/19 10:39

同率2位が100個ということなので、おっしゃる通り110個の要素の辞書を作りたいです。
slushii

2020/12/19 10:54

すみません、間違いでした。同率11位が100個なので、同率1位の10個の単語の辞書になります。
guest

回答3

0

思いつくのは、順位のカウンタを用意しといて、最初から舐めていくってとこですか
それで抜き出す個数を算出しておく、と。

投稿2020/12/19 07:04

y_waiwai

総合スコア88040

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

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

slushii

2020/12/19 10:58

ご回答ありがとうございます。 順位のカウンタというのは、具体的に何をカウントするものでしょうか。 教えていただければ幸いです。
y_waiwai

2020/12/19 11:01

同率ならカウントせずに、変わればカウントしていき、10になったときの個数をだせば、配列の先頭からその個数を抜き出せばいいでしょ。
slushii

2020/12/20 00:34

ありがとうございます。 おかげさまで解決しました。
guest

0

ベストアンサー

ちょっと、作ってみました。

python

1def top_ten(list_txt, top = 10): 2 list_lower = [w.lower() for w in list_txt] 3 b_dict = {} 4 for i in set(list_lower): 5 try: 6 b_dict[list_lower.count(i)].append(i) 7 except: 8 b_dict[list_lower.count(i)] = [i] 9 b_tp = sorted(b_dict.items(), key=lambda x:x[0], reverse=True) 10 rank = 0 11 a_tp = [] 12 for r, wordslist in b_tp: 13 a_tp += [(word, r) for word in wordslist] 14 rank += len(wordslist) 15 if rank >= top: 16 break 17 a_dict = dict(a_tp) 18 return a_dict

実行結果は以下です。

python

1>>> list_txt = ["a", "aa", "A", "BC", "BC", "d", "e", "f", "d", "e", "f", "g", "h", "i", "j", "k", "l", "g", "h", "i", "j", "k", "m"] 2>>> print(top_ten(list_txt)) 3{'e': 2, 'j': 2, 'a': 2, 'd': 2, 'g': 2, 'h': 2, 'k': 2, 'f': 2, 'bc': 2, 'i': 2} 4>>> list_txt = ["a", "aa", "A", "BC", "BC", "d", "e", "f", "d", "e", "ff", "g", "h", "i", "j", "k", "l", "g", "h", "i", "j", "k", "m"] 5>>> print(top_ten(list_txt)) 6{'e': 2, 'j': 2, 'a': 2, 'd': 2, 'g': 2, 'h': 2, 'k': 2, 'bc': 2, 'i': 2, 'aa': 1, 'l': 1, 'm': 1, 'ff': 1, 'f': 1}

投稿2020/12/19 12:40

ppaul

総合スコア24670

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

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

0

たとえば第「10」位までであれば、
a_tp = [('aaa', 8) , ('bbb', 6), ('ccc', 6)...]
の「10番目」(インデックス「9」)以降の要素の集計数を、隣の要素の集計数と比較し、
集計数が等しければ、異なる集計数に出会うまで延長します。

''' 引数  stop:上位第何位まで返すかを指定。  list_txt:集計対象の文字列 ''' def top(stop, list_txt): list_lower = [] for w in list_txt: list_lower.append(w.lower()) a_dict = dict((i, list_lower.count(i)) for i in list_lower) a_tp = sorted(a_dict.items(), key=lambda x:x[1], reverse=True) ''' 以下追加修正 ''' # 集計数が同じ間は延長。異なれば打ち切る。 while stop < len(a_tp) and a_tp[stop - 1][1] == a_tp[stop][1]: stop += 1 return a_tp[:stop]

実行例

python

1''' 2テスト用の文字列を作る 3''' 4import random 5txt=[] 6for i in range(26): 7 txt.extend([chr(i + 65)] * random.randint(1, 20)) 8 9print(txt) 10 11>> ['A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', (略)...] 12 13print(top(10,txt)) 14 15>> [('k', 20), ('s', 18), ('w', 18), ('p', 16), ('v', 15), ('e', 14), ('h', 14), ('m', 14), ('n', 13), ('q', 12), ('o', 12)]

投稿2020/12/19 08:33

編集2020/12/19 12:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

slushii

2020/12/19 11:37

ご回答ありがとうございます。 もしかすると誤解をさせてしまったかもしれません。 頂いた例ですと、想定している出力結果は以下のようになります。 以下では、頻度上位10アルファベットが出力されていますが、10位のアルファベットが2つあるので、 結果として11個のアルファベットが出力されています。 {'n': 20, 'o': 20, 'x': 20, 'g': 19, 'h': 19, 'p': 17, 's': 17, 'y': 17, 'r': 16, 'f': 14, 'v': 14} このような出力を目指す上での助言を頂けますでしょうか。よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2020/12/19 12:31

修正しました
slushii

2020/12/20 00:34

ありがとうございます。 おかげさまで解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問