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

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

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

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

Q&A

解決済

4回答

743閲覧

辞書のなかのkey値のうち記号だけを削除したい

Nene_31

総合スコア4

Python

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

0グッド

1クリップ

投稿2021/11/25 07:28

編集2021/11/25 07:39

ファイルを受け取ってそのファイルの中の英語の文字がそれぞれが何文字ずつ含まれているか数えるプログラムを作っています。
たとえば”aaabbc"という文字列ならaは3もじ、bは二文字、cは一文字のように出力したいです。

いまファイルを読み込み、一文字づつ数えて辞書の形にすることはできました。

python

1d=dict() 2file=open(filename,'r') 3index=0 4for line in file: 5 word=line.strip() 6 l=list(word) 7 for w in l: 8 if w not in d: 9 d[w]=index 10 index+=1 11 12print(d) #それぞれの文字が何文字ずつか

その結果、出力されたもの例として

{'d': 0, 'e': 1, ')': 9, ':': 10, '<': 12, '=': 13, '0': 14,'!': 19, '2': 32}

のようにでてきます。

このなかで)や!、数字など、アルファベット以外の文字をこの辞書や総文字数から消したいです。

先ほどの例なら

{'d': 0, 'e': 1}

のようにしたいです。

ファイルごとにどのような数字や記号が含まれているかはわからないので、でてきた辞書から記号と数字を一つずつ消していくのはできないと思います。
なにか方法はありますか?

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

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

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

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

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

guest

回答4

0

こういう場合は、「不要なものを取り除く」ではなく「必要なものだけ残す」としたほうがやりやすいでしょう。

pythonのstringモジュールにアルファベットのみのリストを持つプロパティがありますのでそれを使います。

python

1import string 2 3char_count = {'d': 0, 'e': 1, ')': 9, ':': 10, '<': 12, '=': 13, '0': 14,'!': 19, '2': 32} 4 5letter_count = {key: char_count[key] for key in char_count.keys() if key in string.ascii_letters} 6 7print(letter_count)

投稿2021/11/25 07:46

TakaiY

総合スコア13792

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

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

0

ベストアンサー

消すのではなく、条件を満たすものだけ取り出せばよいのです。

python

1>>> d = {'d': 0, 'e': 1, ')': 9, ':': 10, '<': 12, '=': 13, '0': 14,'!': 19, '2': 32} 2>>> 3>>> alphabet = 'ABCDEFGHIJILMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 4>>> 5>>> result = {key:d[key] for key in d if key in alphabet} 6>>> print(result) 7{'d': 0, 'e': 1}

投稿2021/11/25 07:36

編集2021/11/25 07:37
ppaul

総合スコア24670

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

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

0

質問にある

このなかで)や!、数字など、アルファベット以外の文字をこの辞書や総文字数から消したいです。

に対して回答します。

まず、辞書に残したい文字だけから構成される文字列を作るか、import します。今回は大文字、小文字問わず、アルファベットのみを残すということなので、他のご回答にもあるように、stringモジュールの ascii_letters を使います。

python3

1from string import ascii_letters

これは、以下のように半角アルファベット小文字と大文字のすべてから構成される文字列です。

python3

1print(ascii_letters)

出力:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

さて、質問にあるような、以下のような内容

{'d': 0, 'e': 1, ')': 9, ':': 10, '<': 12, '=': 13, '0': 14, '!': 19, '2': 32}

の辞書 d があり、文字の合計数、すなわち上記の辞書の各文字の出現回数の合計(110です。)が total_count という変数に入っているとします。

python3

1print(total_count)

出力:

110

このとき、アルファベット以外の文字を辞書dから消し、かつ、その文字の出現回数を total_count から引いていくには、以下のようにします。

まず、d に含まれるキーのうちアルファベット以外のもののリストを作ります。それにはこうします。

python3

1non_alphabetic_letters = [k for k in d.keys() if not k in ascii_letters] 2 3print(non_alphabetic_letters)

出力:

[')', ':', '<', '=', '0', '!', '2']

そして、non_alphabetic_letters に含まれる文字をひとつずつ取り出し、それを d から削除しつつ、その文字の出現回数を total_count から引いていくには以下のようにします。

python3

1for k in non_alphabetic_letters: 2 total_count -= d.pop(k) 3 4 5print(d) 6print(total_count)

出力:

{'d': 0, 'e': 1}

1

以下は上記で説明した内容を、コンソールから確認しています。

イメージ説明

なお、d.pop(k) は、 変数kで与えられるキーが d にない場合、KeyErrorを発生します。もし、このエラーの発生を抑えたい場合には、第二引数で、kで与えられるキーがdにない場合に返す値を指定します。

python3

1{'x': 1}.pop('a', 0) # 0が返される。

先に挙げたコードでは、

python3

1for k in non_alphabetic_letters: 2 total_count -= d.pop(k)

としており、 pop() に第二引数を与えていないです。これは、k が必ずdに含まれるキーだと分かっているので、省略しています。

投稿2021/11/25 10:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

以下は defaultdict を使う方法です。

python

1from collections import defaultdict 2from string import ascii_letters 3 4filename = '...' 5 6count = defaultdict(int) 7with open(filename, 'r') as f: 8 for c in f.read(): 9 if c in ascii_letters: 10 count[c] += 1 11 12print(count)

投稿2021/11/25 07:55

melian

総合スコア20655

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問