我有一个字典列表,可能有也可能没有相似的键,我想将列表展平为一个字典,其值为列表类型。
以下是一个例子:
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
通过它并附加值,但我正在寻找一个更简单的解决方案。
答案 0 :(得分:3)
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'