1

この方法で作成された2つの辞書があります:

tr = defaultdict(list)
tr = { 'critic' : '2_critic', 
 'major' : '3_major',
 'all' : ['2_critic','3_major']
 }

そして2番目のもの:

scnd_dict = defaultdict(list)

そして、このような値が含まれています:

scnd_dict = {'severity': ['all']}

scnd_dictのキーと対応する値を含む 3 番目の dict が必要ですtr。このようにして、私は次のようになります:

third_dict = {'severity' : ['2_critic','3_major']}

私はこれを試しましたが、うまくいきませんでした:

for (k,v) in scnd_dict.iteritems() :
  if v in tr:
    third_dict[k].append(tr[v])

どんな助けでも大歓迎です。ありがとう。

4

6 に答える 6

2

良い...

from collections import defaultdict

tr = {'critic' : '2_critic', 
      'major' : '3_major',
      'all' : ['2_critic','3_major']}

scnd_dict = {'severity': ['all']}

third_dict = {}

for k, v in scnd_dict.iteritems():
    vals = []
    if isinstance(v, list):
        for i in v:
            vals.append(tr.get(i))
    else:
        vals.append(tr.get(v))
    if not vals:
        continue
    third_dict[k] = vals

print third_dict

結果:

>>> 
{'severity': [['2_critic', '3_major']]}

あなたが望むことをします。しかし、ここで defaultdicts を使用するロジック、またはインデックスをリストの一部にするロジックに疑問があります...


非リストを使用するscnd_dictと、すべてをはるかに簡単に実行できます。次のように仮定scnd_dictします: scnd_dict = {'severity': 'all'}:

d = dict((k, tr.get(v)) for k, v in scnd_dict.items())
# {'severity': ['2_critic', '3_major']}
于 2013-06-04T07:42:15.370 に答える
1

あなたの問題は、それvがリストの項目ではなく、リストであることです。したがって、 はif v in tr:false になります。のアイテムを反復処理するようにコードを変更します。v

于 2013-06-04T07:38:02.540 に答える
0

問題は、3 番目の辞書が値がリストであることを認識していないことです。

for k in scnd_dict:
    for v in scnd_dict[k]:
        print v
        for k2 in tr:
            if v==k2:
                if k not in third_dict:
                    third_dict[k]=tr[k2]
                else:
                    third_dict[k]+=tr[k2]
于 2013-06-04T08:00:53.017 に答える
0

2 番目の dict の値は str ではなく list であるため、コードブローは機能します

for (k, v) in send_dict.iteritems():
    if v[0] in tr.keys():
        third_dict[k] = tr[v[0]]
于 2013-06-04T07:46:55.553 に答える
0
third_dict = {k: tr[v[0]] for k, v in scnd_dict.iteritems() if v[0] in tr}

これ

tr = defaultdict(list)

tr次の行で再バインドするだけなら、時間の無駄です。についても同様ですscnd_dict。項目が 1 つしかない場合でも、リストのすべての値を作成することをお勧めします。trこれは、後で心配する特別なケースが少なくなることを意味します。

于 2013-06-04T07:37:17.593 に答える
0
third_dict = {k: [t for m in ks for t in tr[m]] for k,ks in scnd_dict.iteritems()}
于 2013-06-04T07:37:56.613 に答える