Python 3.x 如何使用Python中的键扩展字典中的值

Python 3.x 如何使用Python中的键扩展字典中的值,python-3.x,list,dictionary,Python 3.x,List,Dictionary,如何使用键作为主要约束条件,从字典列表中扩展字典中的值,例如: d = {'a': (), 'b': 0, 'c': "", d: ""} l = [ {'a': (23, 48), 'b': 34, 'c': "fame", d: "who"}, {'a': (94, 29), 'b': 3, 'c': "house", d: "cats"}, {'a': (23, 12), 'b': 93, 'c': "imap", d: "stack"}, ] 给予

如何使用键作为主要约束条件,从字典列表中扩展字典中的值,例如:

d = {'a': (), 'b': 0, 'c': "", d: ""}



l = [ {'a': (23, 48), 'b': 34, 'c': "fame", d: "who"},
      {'a': (94, 29), 'b': 3, 'c': "house", d: "cats"},
      {'a': (23, 12), 'b': 93, 'c': "imap", d: "stack"},
   ]
给予

d = {'a': [(23, 48), (94,29), 23,12], 'b': [34, 3, 94],
      'c': ["fame", "house", "imap"], 'd': ['who', 'cats', 'stack'] }
使用的代码

for i in l:
  d["a"].extend(i.get('a')),
  d["b"].extend(i.get('b')),
  d["c"].extend(i.get('c')),
  d['d'].extend(i.get('d'))

由于默认值是一个空列表,因此可以按如下方式使用
defaultdict


最好注意您应该将
d
初始化为空的dict,这样您就可以迭代
l
和键值对,以在给定的键处将值添加到
d
的子列表中:

l = [
    {'a': (23, 48), 'b': 34, 'c': "fame", 'd': "who"},
    {'a': (94, 29), 'b': 3, 'c': "house", 'd': "cats"},
    {'a': (23, 12), 'b': 93, 'c': "imap", 'd': "stack"},
]
d = {}
for s in l:
    for k, v in s.items():
        d.setdefault(k, []).append(v)
d
变成:

{'a': [(23, 48), (94, 29), (23, 12)],
 'b': [34, 3, 93],
 'c': ['fame', 'house', 'imap'],
 'd': ['who', 'cats', 'stack']}
{'a': [(23, 48), (94, 29), (23, 12), None],
 'b': [34, 3, 93, None],
 'c': ['fame', 'house', 'imap', None],
 'd': ['who', 'cats', 'stack', None]}
如果
l
中的子目录可能包含其他键,则可以将
d
初始化为所需键下的空列表目录:

l = [
    {'a': (23, 48), 'b': 34, 'c': "fame", 'd': "who"},
    {'a': (94, 29), 'b': 3, 'c': "house", 'd': "cats"},
    {'a': (23, 12), 'b': 93, 'c': "imap", 'd': "stack"},
    {'e': 'choices'}
]
d = {k: [] for k in ('a', 'b', 'c', 'd')}
for s in l:
    for k in d:
        d[k].append(s.get(k))
在这种情况下,
d
变成:

{'a': [(23, 48), (94, 29), (23, 12)],
 'b': [34, 3, 93],
 'c': ['fame', 'house', 'imap'],
 'd': ['who', 'cats', 'stack']}
{'a': [(23, 48), (94, 29), (23, 12), None],
 'b': [34, 3, 93, None],
 'c': ['fame', 'house', 'imap', None],
 'd': ['who', 'cats', 'stack', None]}

请注意,除非输入列表中的子目录包含其他键,否则不需要硬编码键列表。@blhsing是的,但我不确定在他的用例中是否总是这样是的,并且从OP的新注释判断,输入列表中的子目录可能毕竟包含其他键,在这种情况下,对密钥列表进行硬编码确实是一种可行的方法。在一般情况下,在提取某些数据时,对所需内容进行硬编码总是很好的。即使这不是最漂亮的东西,非常感谢,但我想问一下,如果我有下一个dict条目l,{e:'choices},并且想把从a到d的所有其他条目,不包括e,我该怎么办it@optimus你可以看看另一个答案,它会解决你的问题,因为选择的钥匙是硬编码的