2016-12-05 15 views
-2

での比較値は、私は辞書を持っている:パイソン - 同じ辞書

d = {'Trump': ['MAGA', 'FollowTheMoney'], 
    'Clinton': ['dems', 'Clinton'], 
    'Stein': ['FollowTheMoney', 'Atlanta']} 

私はキーの値である文字列のリストで重複している文字列を削除したいです。この例では

は、所望の結果は

update_d = {'Trump': ['MAGA'], 
      'Clinton': ['dems', 'Clinton'], 
      'Stein': ['Atlanta']} 

あります同様の質問がhereを頼まれたが、私は私の目的のためにそれを修正することができていません。

私の試み:

new_d = {} 
for key in d: 
    for key2 in d: 
     lst = d[key] 
     lst2 = d[key2] 

     for string in lst: 
      for string2 in lst2: 
       if string not in new_d: 

私の問題は、私はすべてのキーの値を比較し、重複を削除することです。しかし、これがどのように達成されるかはわかりません

+0

ひどい書式設定をおかけして申し訳ありません。 – GRAp

+0

あなたはどのようなコード*を書いていますか、それにどのような問題がありますか? [mcve]をつけてください。これはコード作成サービスではありません。 – jonrsharpe

+0

申し訳ありませんが、投稿の更新が試みられました – GRAp

答えて

0

されていない値を選択しているが、いモジュールを使用せずに重複を削除する:

+0

ありがとうございます。それは完全に動作します。変数 'dupvals'が正確に何をするのか不思議です。 – GRAp

+0

助けになるのはうれしいです。申し訳ありませんが、私はコメントでさらに説明する必要がありました。私は 'dupvals'を' list'変数として使用して「すべての値の重複値」を表しました。すべてのキーからすべての値を取得します。次に、 'dupvals'リストを繰り返して、複数回出現するすべての項目を見つけます。 – davedwards

+0

見て、私はこのようなものを考え出すことができたと思う。もう一度私の解決策は機能していなかったし、本当に矛盾していたことに感謝します。 – GRAp

1

Counterを使用して、各値の表示回数をdにすることができます。この例では

d = {'Trump': ['MAGA', 'FollowTheMoney'], 
    'Clinton': ['dems', 'Clinton'], 
    'Stein': ['FollowTheMoney', 'Atlanta']} 

from collections import Counter 

c = Counter(x for xs in d.values() for x in xs) 

cの値は

Counter({'Atlanta': 1, 
     'Clinton': 1, 
     'FollowTheMoney': 2, 
     'MAGA': 1, 
     'dems': 1}) 

が続いてカウントが正確にCounterを使用してのようにエレガント1.

update_d = {k: [v for v in vs if c[v] == 1] for k, vs in d.items()} 
+0

私は辞書をかなり圧縮していますので、上記の例はうまくいきません。また、私はこの割り当てのための任意のモジュールを使用することはできません。私はforループを使ってキーを反復しようとしましたが、入れ子のforループを使って同じ辞書の異なる値を比較することができないようです。 – GRAp

+0

@GRApあなたの課題で 'Counter'を使うことができない場合は、' Counter'がどのように実装されているのかを考え、自分で実装することをお勧めします。難しくない。 –

+0

したがって、文字列が出現するたびに、新しい変数iを1ずつインクリメントします(i + = 1)。しかし、私は価値と鍵との関係を維持しようとしており、どうやってそれをどうやって進めるのか分かりません。 – GRAp

関連する問題