2

Pythonでは、次のマップのリストがあります。

[{'CN': 'SC',
  'LB': 'g1k',
  'SM': 'HG1'},
 {'CN': 'SC',
  'LB': 'g2k',
  'SM': 'HG2'},
 {'CN': 'SC',
  'LB': 'g3k',
  'SM': 'HG3'}]

そして私はこのような地図を手に入れたいと思います:

{ 'CN' : 'SC',
  'LB' : ['g1k', 'g2k', 'g3k'],
  'SM' : ['HG1', 'HG2', 'HG3']
}

これを行うための最もPython的な方法は何ですか?ありがとう!

psさらに、Webページに表示するために、データの新しい構造をJSONに変換する予定です。

4

4 に答える 4

5
>>> list_of_map = [{'CN': 'SC',
...   'LB': 'g1k',
...   'SM': 'HG1'},
...  {'CN': 'SC',
...   'LB': 'g2k',
...   'SM': 'HG2'},
...  {'CN': 'SC',
...   'LB': 'g3k',
...   'SM': 'HG3'}]
>>> from collections import defaultdict
>>> d = defaultdict(set)
>>> for map in list_of_map:
...     for k,v in map.items():
...         d[k].add(v)
... 
>>> d
defaultdict(<type 'set'>, {'LB': set(['g3k', 'g1k', 'g2k']), 'CN': set(['SC']), 'SM': set(['HG2', 'HG3', 'HG1'])})

これは、必要なデータ構造ではありませんが、非常に近く、本当に必要な場合は簡単に切り替えることができます。set(sの代わりにsがここに行く方法だと思うので、ここでは示していませんlist)。

リストに戻るには:

>>> back_to_lists = {k:list(v) for k,v in d.items()}
>>> back_to_lists
{'LB': ['g3k', 'g1k', 'g2k'], 'CN': ['SC'], 'SM': ['HG2', 'HG3', 'HG1']}

あるいは:

>>> back_to_lists = {k:sorted(v) for k,v in d.items()}
>>> back_to_lists
{'LB': ['g1k', 'g2k', 'g3k'], 'CN': ['SC'], 'SM': ['HG1', 'HG2', 'HG3']}
于 2013-01-29T16:27:24.953 に答える
1

新しいdictの値の順序が重要でない場合は、次の操作を実行できます。

In [1]: maps = [{'CN': 'SC',
   ...:   'LB': 'g1k',
   ...:   'SM': 'HG1'},
   ...:  {'CN': 'SC',
   ...:   'LB': 'g2k',
   ...:   'SM': 'HG2'},
   ...:  {'CN': 'SC',
   ...:   'LB': 'g3k',
   ...:  

In [2]: from itertools import chain

In [3]: {k: set(m[k] for m in maps if k in m) for k in chain.from_iterable(maps)}
Out[3]: 
{'CN': set(['SC']),
 'LB': set(['g2k', 'g1k', 'g3k']),
 'SM': set(['HG3', 'HG2', 'HG1'])}
于 2013-01-29T16:29:11.357 に答える
1
In [21]: nk=[{'CN': 'SC', 'LB': 'g1k', 'SM': 'HG1'},
    ...:  {'CN': 'SC', 'LB': 'g2k', 'SM': 'HG2'},
    ...:  {'CN': 'SC', 'LB': 'g3k', 'SM': 'HG3'}]

In [22]: result={}

In [23]: for x in nk:
    ...:     for k in x:
    ...:         result.setdefault(k,set()).add(x[k])
    ...:         

In [24]: result
Out[24]: 
{'CN': set(['SC']),
 'LB': set(['g3k', 'g1k', 'g2k']),
 'SM': set(['HG2', 'HG3', 'HG1'])}

また

In [60]: nk=[{'CN': 'SC', 'LB': 'g1k', 'SM': 'HG1'},
    ...:  {'CN': 'SC', 'LB': 'g2k', 'SM': 'HG2'},
    ...:  {'CN': 'SC', 'LB': 'g3k', 'SM': 'HG3'}]

In [61]: {z[0][0]:set(z[1]) for z in [zip(*x) for x in zip(*[y.items() for y in [x for x in nk]])]}
Out[61]: 
{'CN': set(['SC']),
 'LB': set(['g3k', 'g1k', 'g2k']),
 'SM': set(['HG2', 'HG3', 'HG1'])}
于 2013-01-29T16:28:42.183 に答える
0

私は、賢くなく、ループのない、ラップされていないオプションを選びます。

ここで、dはdictのリストであり、mdは空のdictです。

for d in dicts:
 for k in d:
  if k in md:
   md[k].add(d[k])
  else:
   md[k]=set([d[k]])
于 2013-01-29T16:42:49.983 に答える