在字典列表中组合相同键的值

akh*_*lsp 4 python

我有以下格式的词典列表:

foo = [
    {'a': 'x', 'b': 'y', 'c': 'z'},
    {'a': 'j', 'c': 'z'}
]
Run Code Online (Sandbox Code Playgroud)

我想将此字典列表分组为一个字典,例如:

bar = {
    'a': ['x', 'j'],
    'b': ['y', None],
    'c': ['z', 'z']
}
Run Code Online (Sandbox Code Playgroud)

我目前正在做的是,遍历所有字典foo并创建键列表,然后再次遍历相同的键来创建bar。我想知道是否有更简单的方法来完成此任务。有人可以帮忙吗?

Nay*_*.py 11

我只是要在这里补充Alex Hall解决方案,这样它就不会返回很多“None”值:

def merge_dictionary_list(dict_list):
  return {
    k: [d.get(k) for d in dict_list if k in d] # explanation A
    for k in set().union(*dict_list) # explanation B
  }
Run Code Online (Sandbox Code Playgroud)

解释:

  • 里面的全部内容{}就是字典理解
  • 解释 A:遍历字典列表中的所有元素,如果当前正在计算的k字典 ( ) 实际上具有该键,则获取当前键的值。d

OBS:如果没有if k in d表达式,可能会在数组中附加一堆None 值,以防字典列表包含不同类型的键。

  • 解释 B:从字典列表中获取所有键,并使用 来将它们明确地统一起来set().union。毕竟我们在集合数据结构中只能有不同的元素。

如果您想以传统方式进行操作,只需执行以下操作:

def merge_list_of_dictionaries(dict_list):
  new_dict = {}
  for d in dict_list:
    for d_key in d:
      if d_key not in new_dict:
        new_dict[d_key] = []
      new_dict[d_key].append(d[d_key])
  return new_dict
Run Code Online (Sandbox Code Playgroud)

我认为第一个解决方案看起来更优雅,但第二个解决方案更清晰/可读。

亲切的问候 :)


Ale*_*all 10

bar = {
    k: [d.get(k) for d in foo]
    for k in set().union(*foo)
}
Run Code Online (Sandbox Code Playgroud)

谷歌的事情:

  • python列表理解
  • python dict理解
  • 蟒蛇星
  • python dict获取
  • python设置联合

  • @Alex Hall +1 添加谷歌搜索提示 (3认同)
  • 好的解决方案,可能会有一些解释。我喜欢`set()。union(* foo)`部分。 (2认同)