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

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

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

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

Q&A

解決済

3回答

1024閲覧

ファイルのデータを辞書にする

makaron

総合スコア11

Python

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

0グッド

0クリップ

投稿2018/08/02 12:58

編集2018/08/02 13:11

あるデータを持つファイルを読み込んで、それを辞書型にするコードを書きたいです。
私の書いたコードではエラーはでないのですが、結果も出力されません。何が違うのかおしえて頂きたいです。
(あくまでもファイルを読みこみ、それを辞書型にするという形で、直接辞書を作るということは避けたいです)

あるファイル

りんご\t 123\t わかめ\t 2536
みかん\t 245\t かつお\t 1234
:
:
:
(このように続いていきます)

これを、dictionary構造で、
key='りんご:わかめ'
'みかん:かつお'
value='123:2536'
'245:1234'
のように、分類したいです。

以下が私の書いたコードなのですが、エラーもでないので、どこが間違えているのかがわかりません。python初心者なので、解説もつけて答えを教えてくださると助かります。よろしくお願いします。

python

f = open(ファイル名)
dictionary = {}
for line in f:
inputs = line.split("\t")
if len(inputs) != 4:
continue
dictionary['inputs[0]:inputs[2]']='inputs[1]:inputs[3]'
print dictionary.keys()

よろしくお願いします。

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

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

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

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

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

hayataka2049

2018/08/02 13:08

前の質問でも気になっていましたが、tabは\tです。/tは間違い
makaron

2018/08/02 13:11

ご指摘ありがとうございます。変更しました。
hayataka2049

2018/08/02 13:12

インデントがどう考えてもおかしい状況なので、「エラーもでない」状況のコードをコピペして貼ってください
makaron

2018/08/02 13:19

ありがとうございます。そうしたいのですが、今macからterateilへの質問や、回答が一切つながらず、困っている状況です。スマホからコードを写して打っているので、コピペができません。申し訳ありません。インデント、もう一度確認してみます。
hayataka2049

2018/08/02 13:26

PCから繋がらないという状況がかなり意味不明ですが(そもそもネットに繋がってない、teratailにログインしてないとかそういう次元の問題?)、そうだとしてもPCからメールとかオンラインストレージとかでスマホに送って、コピペするだけっすね
guest

回答3

0

文字列の中に変数の値を埋め込みたい場合は、ちょいと工夫しなければなりません。

Python

1>>> answer = 42 2>>> 3>>> 'answer=answer' 4'answer=answer' 5>>> 6>>> 'answer=%s' % (answer,) 7'answer=42' 8>>> 9>>> 'answer={0}'.format(answer) 10'answer=42' 11>>> 12>>> f'answer={answer}' 13'answer=42'

なお、最後の書き方はPython3.6以降で導入されているf-string記法です。


ご提示のコードを見る限り、Python2.7を利用されているようですね。
質問にはPythonのバージョンを明記するようにしてください。

なお、Python2.7のサポートは2020年に打ち切られます。
特段の理由が無ければ、3系に乗り換えることを強く推奨します。

投稿2018/08/02 13:10

編集2018/08/02 13:12
LouiS0616

総合スコア35660

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

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

makaron

2018/08/02 13:17

ご指摘ありがとうございます。 この、answerというのは何を示していますか?理解不足で申し訳ないです。 pythonのバージョンについてのご指摘、ありがとうございます!余裕ができたらバージョンについても調べてみます!
LouiS0616

2018/08/02 13:21

> この、answerというのは何を示していますか? 『変数の値を文字列に埋め込むのには工夫が必要』であることを説明するためのコードなので、特に意味はないです。 42にしたのは某SF小説のオマージュです。
makaron

2018/08/02 13:22

たびたび申し訳ありません。 今、文字列1つ1つにIDがあるので、そちらで分類することも可能です。 例えばりんごを23 わかめを34のようにして、keyを'23:34'のようにして扱えます。この場合は先ほどの私のコードを修正すれば表示できるようになりますか?
LouiS0616

2018/08/02 13:24

文字列対IDの辞書を生成すれば可能かと。
makaron

2018/08/02 13:34

何回も読んだら理解ができました! ありがとうございます。文字列を使わない方法でやってみようと思います!
guest

0

dictionary['inputs[0]:inputs[2]']='inputs[1]:inputs[3]'

インデントがおかしい。

投稿2018/08/02 13:06

KojiDoi

総合スコア13671

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

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

makaron

2018/08/02 13:13

ご指摘ありがとうございます! 変更してみましたが、なにもかわらないみたいでした、、(パソコンの方のコードを直しました。)現在、自分のパソコンからterateilにつながらず、スマホでコードを打っているので、上の画面上だとうまく変更ができないのですが、実際のコードはcontinueと同じとこにしました。
guest

0

ベストアンサー

インデントが崩れてるとどうしようもないのがpythonなのですが・・・はやくパソコンから繋がるようにしてくださいね。
(というか、繋がらないってなんだろう。ネットが繋がってログインできれば良いだけだと思うんですが)

とりあえず、正しいであろうインデントに戻す。

python

1txt = """りんご\t123\tわかめ\t2536 2みかん\t245\tかつお\t1234""" 3 4f = txt.splitlines() # てぬき 5dictionary = {} 6for line in f: 7 inputs = line.split("\t") 8 if len(inputs) != 4: 9 continue 10 dictionary['inputs[0]:inputs[2]'] = 'inputs[1]:inputs[3]' 11print(dictionary.keys())

continueと同じとこ

そこにdictionary以下のコードを入れると、何も実行されないことでしょう。

残念ながら文字列中に書いた式を適切に評価してくれたりはしないので(python3.6以降ならf-stringがありますが)、%記法とかstr.formatとかを使って組み立ててもいいし、慣れないうちは簡単に文字列連結で書いてもいいでしょう。

python

1txt = """りんご\t123\tわかめ\t2536 2みかん\t245\tかつお\t1234""" 3 4f = txt.splitlines() # てぬき 5dictionary = {} 6for line in f: 7 inputs = line.split("\t") 8 if len(inputs) != 4: 9 continue 10 dictionary[inputs[0]+":"+inputs[2]] = inputs[1]+":"+inputs[3] # +演算子で結合 11print(dictionary.items()) # keysだけ見ても仕方ないのでitemsにしておく 12""" => 13dict_items([('りんご:わかめ', '123:2536'), ('みかん:かつお', '245:1234')]) 14"""

投稿2018/08/02 13:21

hayataka2049

総合スコア30933

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

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

makaron

2018/08/02 13:25

ありがとうございます! これで今から実装してみます。以前はつながっていたんですが、一週間くらい前からいきなりつながらなくなり、質問するボタンを押すとずっと画面が止まってしまいます。(なので、スマホを使っています) 実装してみて、分からないことがあればまた質問させていただきます。よろしくお願いします。
hayataka2049

2018/08/02 13:27

ブラウザの問題ですかね。キャッシュ消したり、最新版に更新したりで治りませんか。あとは、他のブラウザからだと繋がったりしません?
makaron

2018/08/02 13:32

一応、他のブラウザで試したり、アカウント作り直したりはしてみたのですがどれもだめでした。教えていただいた前者の二つはやっていないのでやってみます!アドバイスありがとうございます。 また、教えていただいたコードで実行ができました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問