在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']
}
最狡猾的方式是什么? 谢谢!
P.S。此外,我打算将新的数据结构转换为JSON,以便在网页中显示。
答案 0 :(得分: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
是这里的方式,而不是list
s。
返回列表:
>>> 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']}
答案 1 :(得分: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'])}
答案 2 :(得分:1)
如果新词典的值中的顺序无关紧要,您可以执行以下操作:
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'])}
答案 3 :(得分:0)
我会选择打开的,不聪明的,循环的选项..
其中d是你的dicts列表,而md是一个空字典
for d in dicts:
for k in d:
if k in md:
md[k].add(d[k])
else:
md[k]=set([d[k]])