如何初始化先验未知数量的列表

时间:2016-01-07 12:05:43

标签: python arrays json list dictionary

我正在尝试用python重构json文件。 json是一个json数组,其中每个元素都是一个字典。在这些词典中,对于一些对我来说很重要的键有很多重复值,所以我想把每个字典的所有其他键放在一个数组中,用于重要键的相同值,创建一个具有不同结构的json

然后对于某些键的每个不同值,我想初始化一个数组。问题是此密钥的不同值的数量是先验未知。我想要的代码示例:

data = json.loads(originalJson)

# List of different authors for key ['author']
authors = []
for x in data:
    if x['author'] not in authors:
        authors.append(x['author'])

newData = []      
for author in authors:
    for x in data:
        if x['author'] == author:
  # And here is the code that initialize 
  # a different array for each author

P.S。:如果你知道一种更有效的方法来重新组织一个json,请给我一个链接,例子或其他东西。你会注意到我是python的“非常初学者”。

编辑:输入和输出的例子

originalJson = [{ke1 : value, key2 : value, key3 : value,...},{...},....]

wantedJson = [{key1 : valueX,[{key2 : value, ...},{key3 : value,...},...]},
{key1 : valueY, [...]},{key1 : valueZ,[...]}]

1 个答案:

答案 0 :(得分:3)

您可以使用collections.defaultdict,就像这样

from collections import defaultdict
d = defaultdict(list)
for x in data:
    d[x['author']].append(x)

每当找到一位不在字典中的作者时,将创建一个新列表并将其用作值,并将当前项追加到列表中。

您也可以使用普通词典(例如

)执行相同的操作
d = {}
for x in data:
    d.setdefault(x['author'], []).append(x)

如果您想从文件中读取作者的顺序,那么您可以使用collections.OrderedDict,就像这样

from collections import OrderedDict
d = OrderedDict
for x in data:
    d.setdefault(x['author'], []).append(x)