展平词典列表

时间:2015-04-22 14:01:24

标签: python dictionary

我有一个字典列表,可能有也可能没有相似的键,我想将列表展平为一个字典,其值为列表类型。

以下是一个例子:

data =  [{'category': u'Non-profit organization', 'categories': [u'Theater',
      u'Bar', u'Concert Venue']}, {'category': u'Non-profit organization', 
      'categories': [u'Business Services', u'College & University']}]

这应该成为以下内容:

print result
result = {'category': [u'Non-profit organization', u'Non-profit 
      organization'], 'categories': [u'Theater', u'Bar', u'Concert Venue',       
      u'Business Services', u'College & University']]}

如您所见,初始数据中任何字符串值都应添加为列表中的值。在初始字典中以列表类型保存的任何内容都应该添加其键,但是要创建一个展平列表。

显然,一个简单的解决方案是for loop通过它并附加值,但我正在寻找一个更简单的解决方案。

2 个答案:

答案 0 :(得分:3)

使用defaultdict(list)

from collections import defaultdict

res = defaultdict(list)
for dic in data:
    for key, value in dic.items():
        old_value = res[key]
        if isinstance(value, list):
            old_value.extend(value)
        else:
            old_value.append(value)

        # alternatively:
        old_value += [value] if not isinstance(value, list) else value

原因是:最后你希望所有的值都是list s。不同之处在于,最初应将列表连接在一起的值(list.extend执行此操作),而其他值应插入新列表中(如list.append中所示)。

此外,collections模块中没有自动执行此操作的内置方法或类,因此我认为上述方法可能是最佳的"考虑到代码维度,可读性和效率。

答案 1 :(得分:0)

在之前的其他答案中(抱歉,我没有足够的声誉来撰写评论)您需要检查res中的值是否有重复值:

{'category': [u'Non-profit organization', u'Non-profit organization'], 'categories': [u'Theater', u'Bar', u'Concert Venue', u'Business Services', u'College & University']}

两次u'Non-profit organization'