0

関数を使用してPythonの辞書内に辞書を作成したいと思いますsetdefault()。休耕地辞書を使って名前と生年月日をリストアップしようとしています。

names = {'Will': 'january', 'Mary': 'february', 'George': 'march', 'Steven': 'april', 'Peter': 'may'}
dates = {'Will': '7/01', 'George': '21/03', 'Steven': '14/03', 'Mary': '2/02'}

私はこれを達成するためにセットを使用しようとしていました:

res_dict = dict()
for v, k in names.items():
    for v1, k1 in dates.items():
        res_dict.setdefault(v, {}).append(k)
        res_dict.setdefault(v1, {}).append(k1)
return res_dict

しかし、それは私にエラーを与えます。

結果は次のようになります。

res_dict = {'Will': {'january': '7/01'}, 'Mary' : {'february': '2/02'} ,'George': {'march': '21/03'}, 'Steven': {'april': '14/03'}, 'Peter': {'may': ''}}

どうすれば目的の結果を得ることができsetdefault()ますか?

4

3 に答える 3

2

これを試すことができます:

In [17]: results = {}

In [18]: for k, v in names.iteritems():
    results[k] = {v: dates.setdefault(k, '')}
   ....:
   ....:

In [20]: results
Out[20]: 
{'George': {'march': '21/02'},
 'Mary': {'february': '2/02'},
 'Peter': {'may': ''},
 'Steven': {'april': '14/03'},
 'Will': {'january': '7/01'}}

monthとの追加に関するコメントについてはday、同様に追加できます。

In [28]: for k, v in names.iteritems():
    results[k] = {'month': v, 'day': dates.setdefault(k, '')}
   ....:
   ....:

In [30]: results
Out[30]:
{'George': {'day': '21/02', 'month': 'march'},
 'Mary': {'day': '2/02', 'month': 'february'},
 'Peter': {'day': '', 'month': 'may'},
 'Steven': {'day': '14/03', 'month': 'april'},
 'Will': {'day': '7/01', 'month': 'january'}}

day値が存在しない場合に完全に省略したい場合は、次のようにします。

In [8]: results = {}

In [9]: for k, v in names.iteritems():
   ...:     results[k] = {'month': v}
   ...:     if dates.has_key(k):
   ...:         results[k]['day'] = dates[k]
   ...:
   ...:

In [10]: results
Out[10]:
{'George': {'day': '21/03', 'month': 'march'},
 'Mary': {'day': '2/02', 'month': 'february'},
 'Peter': {'month': 'may'},
 'Steven': {'day': '14/03', 'month': 'april'},
 'Will': {'day': '7/01', 'month': 'january'}}

また、日付はわかっているが月がわからないという奇妙なケースでは、キーのセットを (@KayZhu が示唆しているように) a で反復処理するのdefaultdictが最も簡単な解決策かもしれません。

In [1]: from collections import defaultdict

In [2]: names = {'Will': 'january', 'Mary': 'february', 'George': 'march', 'Steven': 'april', 'Peter': 'may'}

In [3]: dates = {'Will': '7/01', 'George': '21/03', 'Steven': '14/03', 'Mary': '2/02', 'Marat': '27/03'}

In [4]: results = defaultdict(dict)

In [5]: for name in set(names.keys() + dates.keys()):
   ...:     if name in names:
   ...:         results[name]['month'] = names[name]
   ...:     if name in dates:
   ...:         results[name]['day'] = dates[name]
   ...:
   ...:

In [6]: for k, v in results.iteritems():
   ...:     print k, v
   ...:
   ...:
George {'day': '21/03', 'month': 'march'}
Will {'day': '7/01', 'month': 'january'}
Marat {'day': '27/03'}
Steven {'day': '14/03', 'month': 'april'}
Peter {'month': 'may'}
Mary {'day': '2/02', 'month': 'february'}
于 2012-10-27T07:33:18.467 に答える
1

簡単なワンライナー:

In [38]: names = {'Will': 'january', 'Mary': 'february', 'George': 'march', 'Steven': 'april', 'Peter': 'may'}

In [39]: dates = {'Will': '7/01', 'George': '21/03', 'Steven': '14/03', 'Mary': '2/02'}

In [40]: dict((name,{names[name]:dates.get(name,'')}) for name in names)

out[40]: 
    {'George': {'march': '21/03'},
     'Mary': {'february': '2/02'},
     'Peter': {'may': ''},
     'Steven': {'april': '14/03'},
     'Will': {'january': '7/01'}}
于 2012-10-27T08:31:51.857 に答える
0

最初にスーパーセット キーnamesを取得する必要があります。dates

>>> for k in set(names.keys() + dates.keys()):
...     res_dict[k] = {names.setdefault(k, ''): dates.setdefault(k, None)}
...     
... 
>>> res_dict
{'Will': {'january': '7/01'}, 'Steven': {'april': '14/03'}, 'Peter': {'may': None},
 'Mary': {'february': '2/02'}, 'George': {'march': '21/03'}}

そうしないと、キーが にあるdatesが にない結果を見逃すことになりますnames

于 2012-10-27T08:06:03.530 に答える