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

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

ただいまの
回答率

91.00%

  • Python 3.x

    4106questions

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

python3 リストから辞書へ変換

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 224

Sample_Test

score 89

1.txtは冒頭&末尾に改行は有りません。

1.txt

Apple リンゴ 5
orange 蜜柑 3
banana バナナ 2
strawberry 苺 3
peach 桃 4
pear 梨 4
Grape ぶどう 4
melon メロン 4
watermelon スイカ 7
Cherry さくらんぼ 1
persimmon 柿 3
pineapple パイナップル 6
grapefruit グレープフルーツ 3

現状のコード

l=[]
r=[]
f = open('1.txt', 'r')

for line in f:
    l.append(line.replace('\n',''))

f.close()

for i in l:
    r.append(i.replace(r'\u','').split())

dic=[]
for i in r:
    dic.append(dict(zip(i[0],i[2])))

print(dic)

現状の結果

[{'A': '5'}, {'o': '3'}, {'b': '2'}, {'s': '3'}, {'p': '4'}, {'p': '4'}, {'G': '4'}, {'m': '4'}, {'w': '7'}, {'C': '1'}, {'p': '3'}, {'p': '6'}, {'g': '3'}]

上記を下記の様に変更したい。

{'Apple': '5'}, {'orange': '3'}, {'banana': '2'},,,,
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2018/01/11 14:11

    {'Apple': '5', 'orange': '3', 'banana': '2',,,,} じゃなくて?

    キャンセル

回答 2

checkベストアンサー

0

こんな感じですかね。

my_dict = {}
with open('1.txt') as f:
    for row in f:
        en, jp, num = row.split()
        my_dict[en] = num

print(my_dict)
{'Apple': '5', 'orange': '3', 'banana': '2', 'strawberry': '3', 'peach': '4', 'pear': '4', 'Grape': '4', 'melon': '4', 'watermelon': '7', 'Cherry': '1', 'persimmon': '3', 'pineapple': '6', 'grapefruit': '3'}

元のコードを活かしたいなら

dic=[]
for i in r:
    dic.append(dict(zip(i[0],i[2])))

次のように書けばいいです。

dic = {}
for elem in r:
    en, jp, num = elem
    dic[en] = num

print(dic)

内包表記ならば、こう。

dic = {en:num for en, jp, num in r}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 14:24

    余談なのですが、冒頭を実行すると
    SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 123-124: truncated \uXXXX escape
    となります。

    今回の場合は、どの様にしたら解決できるでしょうか?
    (今後の為に教えて下さると幸いです。)

    キャンセル

  • 2018/01/11 14:25

    csvリーダーで読んだ方が良いかな?と思いましたが、元データに半角/全角スペースが入り混じっているので止めました。

    キャンセル

  • 2018/01/11 14:25

    冒頭とは、なんの冒頭でしょうか?

    キャンセル

  • 2018/01/11 14:30

    回答の一番最初のコードです。

    キャンセル

  • 2018/01/11 14:37

    https://ja.stackoverflow.com/questions/11582/python%E3%81%A7%E7%B0%A1%E5%8D%98%E3%81%AA%E3%83%A9%E3%83%B3%E3%83%81%E3%83%A3%E3%83%BC%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86%E3%81%A8%E6%80%9D%E3%81%86%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8Copen%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%99

    キャンセル

  • 2018/01/11 14:37

    ↑これだと思いますよ。

    キャンセル

  • 2018/01/11 14:49

    恥ずかしながら、何処にrを付け加えて良いのか分かりません。
    with open(r'1.txt') as f:
    など、試して居るのですが、ご存知ないでしょうか?

    キャンセル

  • 2018/01/11 14:55

    rをつける場所はそれであっていますし、そもそもフルパスでなかったのですね。
    ファイル名の『1』が全角になったりしていませんか?

    キャンセル

  • 2018/01/11 14:58

    失礼しました。
    ソースファイルの下部で別の処理がエラーになっていました。

    ありがとうございました。

    キャンセル

  • 2018/01/11 15:18

    フィードバック
    単体テストで、
     r の記載がなくても実行可能でした。

    環境
    Linux Mint 18.3 Sylvia 64 ビット

    テキスト編集ソフト 小型軽量テキストエディタ xed
    1.txt エンコーディング UTF-8 行末Unix/Linux

    お騒がせしました。

    キャンセル

  • 2018/01/11 15:27

    上手くいったようで何よりです。
    一応解説しておくと、rプレフィックスを付けることで文字列をraw文字列にすることが出来ます。
    raw文字列の特長は、内部でエスケープ記号をそのまま使えることです。
    特にエスケープ記号を区切り文字として活用するWindowsのパス表記の際には威力を発揮します。

    しかし、利用されている環境がLinux、しかもファイル名のみの表記になっていることからも、今回のエラーにはraw文字列の有無は無関係だろうということがわかります。

    raw文字列はほとんどメリットしかないような機能なので、これを機に覚えてやってください。

    キャンセル

0

array = []
dic = {}
for i in r:
    array.append({i[0]:i[2]})
    dic[i[0]] = i[2]

print(array)
#=> [{'Apple': '5'}, {'orange': '3'}, ...]

print(dic)
#=> {'Apple': '5', 'orange': '3', ...}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 91.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    4106questions

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