2017-11-02 11 views
1

言語辞書を逆転しようとしています。問題は、いくつかの単語に同義語があることです。既存の値を上書きせずに同義語を入力するにはどうすればよいですか? 上書きしないで既存のキーに値を追加する

latin_dic ={'apple': ['malum', 'pomum', 'popula'], 'fruit': ['baca', 'bacca', 'popum'], 'punishment': ['malum', 'multa']} 
    new_dict={} 
    for k,v in latin_dic.items(): 
     for item in v: 
      if item in new_dict: 
       new_dict[item] += k 
      else: 
       new_dict[item]= k 
    for k,v in sorted(new_dict.items()): 
     print(k, '-', v) 

単語のこの辞書にprblem

は私の努力で上記「applepunishment」として出てくることmalum =リンゴと罰です。私は連結が間違っていることを知っていますが、それは私が持っている最も近いものです。私は追加を使用することはできませんまたはむしろそれはエラーを与えます。私はアドバイスに感謝します。私は自分の満足のために蛇のコースを完了しようとしており、これが最後の質問です。

答えて

2

新しい辞書の各値がリストであることを確認する必要があります。代わりに

new_dict[item] = k # the value is a string 

のあなたは、あなたがそのリストに追加することができ

new_dict[item] = [k] # the value is a list with the item 

を必要としています。 全コード:

latin_dic ={'apple': ['malum', 'pomum', 'popula'], 'fruit': ['baca', 'bacca', 'popum'], 'punishment': ['malum', 'multa']} 
new_dict={} 
for k,v in latin_dic.items(): 
    for item in v: 
     if item in new_dict: 
      new_dict[item].append(k) 
     else: 
      new_dict[item] = [k] 
for k,v in sorted(new_dict.items()): 
    print(k, '-', v) 
+0

ありがとうございます。出力のためには、質問には形式の翻訳、翻訳が必要です。だから私はまだリストを 'リストから外す'必要があります。 – user1478335

+1

辞書にキーが存在するかどうかをテストするときに 'dict.keys()'を呼び出す必要はありません。 'if item in new_dict:'を使うだけです。 – mhawke

+0

@mhawkeありがとうございます。私は今それを変更しました。 (私はそれが問題だったかどうかをテストしていたので、私はそれを元に戻すのを忘れていた)。 –

2

リストにのみ機能するため、appendを使用することはできません。しかし、あなたの新しい辞書では、キーは常に文字列なので、を書くと、new_dict [item] = kとなります。新しい辞書の値は単なる文字列であり、リストではないと言います。

latin_dic ={'apple': ['malum', 'pomum', 'popula'], 'fruit': ['baca', 'bacca', 'popum'], 'punishment': ['malum', 'multa']} 
new_dict={} 
for k,v in latin_dic.items(): 
    for item in v: 
    if item in new_dict: 
     new_dict[item].append(k) 
    else: 
     new_dict[item] = [k] 

for k,v in sorted(new_dict.items()): 
    print(k, '-', v) 

は、今、私たちはあなたのnew_dictがリストとして 常に値宣言し、あなたはAPPENDを使用することができます。私たちは、非常に簡単にそれを修正することができます。

+2

あなたのご提案もありがとうございます。私は1つの答えだけを '承認'することができますが、両方とも同じソリューションを投稿しましたが。ちょうど私がまだpythonの細部とsbtiltiesを把握していないことを示しています!一口! – user1478335

+0

問題はありません、私は私たちが助けることができてうれしいです!幸運をPythonを学ぶ! – Basti

2

修正、他の人が投稿しているとして、新しい辞書が既に関連付けられた値を持つキーが含まれていない場合は、現在のキーを含む新しいリストを作成することです。

あなたはこのように、[]のデフォルト値でdict.get()を使用してif文で辞書検索を避けることができます。

latin_dic = {'apple': ['malum', 'pomum', 'popula'], 'fruit': ['baca', 'bacca', 'popum'], 'punishment': ['malum', 'multa']} 
english_dic = {} 

for k in latin_dic: 
    for v in latin_dic[k]: 
     english_dic[v] = english_dic.get(v, []) + [k] 

for k in sorted(english_dic): 
    print(k, '-', english_dic[k]) 

また、この操作を実行するためのよりよい方法はdefaultdictであります

from collections import defaultdict 

latin_dic = {'apple': ['malum', 'pomum', 'popula'], 'fruit': ['baca', 'bacca', 'popum'], 'punishment': ['malum', 'multa']} 
english_dic = defaultdict(list) 

for k in latin_dic: 
    for v in latin_dic[k]: 
     english_dic[v].append(k) 

for k in sorted(english_dic): 
    print(k, '-', english_dic[k]) 
+0

ありがとうございます。私もあなたの提案を勉強します。出力が['word']ではなく、リストに含まれているのがベストでしょう。それを達成する方法はありますか? – user1478335

+0

は、print(k、 ' - '、v)をprint(k、 ' - '、 '、' .join(v))に変更して出力を管理しました。 – user1478335

関連する問題