将下面显示的现有dict列表转换为新的dicts列表的最佳方法是什么?
鉴于:
data = [{'count': 3}, {'day': '2013-07-14'}, {'count': 5}, {'day': '2013-04-14'}]
预期产出:
newlist = [{'name': 'day', 'data': ['2013-07-14', '2013-04-14']}, {'name': 'count','data': [3, 5]}]
答案 0 :(得分:1)
如评论中所述。粘贴的数据没有正确匹配的大括号。它也有错误的引用类型(不是正常的单引号)。
问题是您是否需要浅或深副本。
>>> data = [{'count': 3}, {'day': '2013-07-14'}, {'count': 5}, {'day': '2013-04-14'}]
>>> import copy
>>> datacopy = copy.deepcopy(data)
>>> print datacopy
[{'count': 3}, {'day': '2013-07-14'}, {'count': 5}, {'day': '2013-04-14'}]
>>> print id(datacopy[0])
140321178253024
>>> print id(data[0])
140321178192704
对 id 的调用显示第0个元素中的项目位于不同的地址位置,因此是真正的深层副本。
与浅副本形成鲜明对比,其中id调用返回相同的地址:
>>> datacopyShallow = copy.copy(data)
>>> print datacopyShallow
[{'count': 3}, {'day': '2013-07-14'}, {'count': 5}, {'day': '2013-04-14'}]
>>> print id(data[0])
140321178192704
>>> print id(datacopyShallow[0])
140321178192704
修改强>
请注意,这适用于所提出的原始问题。预期的输出随后发生了变化,这意味着虽然预期的新格式的结构似乎不正确,但实际上有一些转换需要而不是直接复制。
答案 1 :(得分:1)
您似乎正在尝试将数据分组在一起。我会在新列表中使用dict(),老实说......但我会在最后添加转换为列表。
基本上只需迭代你的dicts列表,然后迭代这些dicts并将它们添加到新的dict中。使用dict作为目标是最简单的,因为它可以让你只添加到适当的列表元素。在这一点上,我会停下来并使用dict作为输出,但要完全回答你的问题......
然后将该dict转换回您正在寻找的格式的dicts列表。使用字典和列表推导可能有更聪明的方法,但如果你正在学习,这可能会更容易。
data = [{'count': 3}, {'day': '2013-07-14'}, {'count': 5}, {'day': '2013-04-14'}]
group=dict()
for d in data:
for item in d:
try:
group[item].append(d[item])
except KeyError:
group[item] = [d[item]]
newlist = []
for item in group:
newlist.append( {'name' : item, 'data' : group[item]} )
新名单的内容:
>>> newlist
[{'data': [3, 5], 'name': 'count'}, {'data': ['2013-07-14', '2013-04-14'], 'name': 'day'}]