0

このコードが機能しないのはなぜですか? key3 のキー エラーを返します。adict には key3 があり、空の辞書にキーを追加する方法と同じように見えますが、ループ内でキーを相互に渡している点が異なります。キーと値をあるディクショナリから同じ主キーを持つ新しいディクショナリに渡すにはどうすればよいですか?

adict = {'key1':{'a':.078, 'b':1000, 'c':100},
                          'key2':{'a':.0645, 'b':10, 'c':5},
                          'key3':{'a':.0871, 'b':250, 'c':45},
                          'key4':{'a':.0842, 'b':200, 'c':37},
                          'key5':{'a':.054, 'b':409, 'c':82},
                          'key6':{'a':.055, 'b':350, 'c':60}}

another_dict = {}
for k in adict:
    another_dict[k]['transferred'] = adict[k]['b']


>>>   Traceback (most recent call last):
      File "C:\Python27\test.py", line 26, in <module>
        another_dict[k]['transferred'] = adict[k]['b']
      KeyError: 'key3'
4

5 に答える 5

2

another_dict[k]アクセスする前に、新しい辞書を作成する必要があります。

adict = {'key1':{'a':.078, 'b':1000, 'c':100},
                      'key2':{'a':.0645, 'b':10, 'c':5},
                      'key3':{'a':.0871, 'b':250, 'c':45},
                      'key4':{'a':.0842, 'b':200, 'c':37},
                      'key5':{'a':.054, 'b':409, 'c':82},
                      'key6':{'a':.055, 'b':350, 'c':60}}

another_dict = {}
for k in adict:
    if k not in another_dict:
        another_dict[k] = {}
    another_dict[k]['transferred'] = adict[k]['b']
于 2012-12-23T17:14:58.383 に答える
2

私が正しく理解していれば、dict内包表記を使用するのはかなり簡単です。

>>> pprint({k:{'transferred':v['b']}  for k, v in adict.iteritems()})
{'key1': {'transferred': 1000},
 'key2': {'transferred': 10},
 'key3': {'transferred': 250},
 'key4': {'transferred': 200},
 'key5': {'transferred': 409},
 'key6': {'transferred': 350}}

特定のサブキーのみを保持する便利な機能を実行することもできます(同じ名前を付ける場合)

>>> from operator import itemgetter
>>> def dict_with_subkeys(odict, *keys):
    return {k:dict(zip(keys, itemgetter(*keys)(odict[k]))) for k in odict}

>>> pprint(dict_with_subkeys(adict, 'a', 'c'))
{'key1': {'a': 0.078, 'c': 100},
 'key2': {'a': 0.0645, 'c': 5},
 'key3': {'a': 0.0871, 'c': 45},
 'key4': {'a': 0.0842, 'c': 37},
 'key5': {'a': 0.054, 'c': 82},
 'key6': {'a': 0.055, 'c': 60}}
于 2012-12-23T17:19:48.603 に答える
1

を使用して、まだ作成されていないの dict のキーanother_dict[k]['transferred']にアクセスしようとしています。'transferred'key k

ここで使用できdefaultdictます: -

from collections import defaultdict
another_dict = defaultdict(dict)

変更されたコード: -

>>> from collections import defaultdict
>>> adict = {'key1':{'a':.078, 'b':1000, 'c':100},
...                           'key2':{'a':.0645, 'b':10, 'c':5},
...                           'key3':{'a':.0871, 'b':250, 'c':45},
...                           'key4':{'a':.0842, 'b':200, 'c':37},
...                           'key5':{'a':.054, 'b':409, 'c':82},
...                           'key6':{'a':.055, 'b':350, 'c':60}}
... 
... another_dict = defaultdict(dict)
... for k in adict:
...     another_dict[k]['transferred'] = adict[k]['b']

>>> another_dict
5: defaultdict(<type 'dict'>, {'key3': {'transferred': 250}, 
                           'key2': {'transferred': 10}, 
                           'key1': {'transferred': 1000}, 
                           'key6': {'transferred': 350}, 
                           'key5': {'transferred': 409}, 
                           'key4': {'transferred': 200}})
于 2012-12-23T17:13:26.723 に答える
1

問題はanother_dict[k]実際にはまだ存在せずanother_dict[k]['transferred']、初期化さえされていないことをしようとしています。したがって、最初に初期化する必要があります。

In [35]: adict = {'key1':{'a':.078, 'b':1000, 'c':100},
                          'key2':{'a':.0645, 'b':10, 'c':5},
                          'key3':{'a':.0871, 'b':250, 'c':45},
                          'key4':{'a':.0842, 'b':200, 'c':37},
                          'key5':{'a':.054, 'b':409, 'c':82},
                          'key6':{'a':.055, 'b':350, 'c':60}}

In [36]: another_dict={}

In [37]: for k in adict:
    another_dict[k]={}                          #initialize another_dict[k]
    another_dict[k]['transferred']=adict[k]['b']

In [38]: another_dict
Out[38]: 
{'key1': {'transferred': 1000},
 'key2': {'transferred': 10},
 'key3': {'transferred': 250},
 'key4': {'transferred': 200},
 'key5': {'transferred': 409},
 'key6': {'transferred': 350}}
于 2012-12-23T17:14:53.560 に答える
0

ありがとう@Ashwini私はあなたのポイントを理解しています。そして@Jonも。

Python と ("Dictionary Comprehensions"?) が上手になるにつれて、私が見つけた別の解決策は次のとおりです。

another_dict = {k:{'b':adict[k]['b']} for k in adict}
于 2012-12-23T17:45:14.043 に答える