将dicts列表转换为具有不同格式的新dicts列表

时间:2014-06-26 01:20:08

标签: python dictionary

将下面显示的现有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]}]

2 个答案:

答案 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'}]