使用Python将一个JSON对象/ dict转换为两个

问题描述 投票:0回答:3

我有像这样格式化的JSON数据。

  {
    "website": "http://www.zebrawebworks.com/zebra/bluetavern/day.cfm?&year=2018&month=6&day=29", 
    "date": "2018-06-29", 
    "headliner": [
      "Delta Ringnecks", 
      "Flathead String Band"
    ], 
    "data": [
      "4:00 PM", 
      "FEE:  $0", 
      "Jug Band Music", 
      "8:00 PM", 
      "FEE:  $5", 
      "Old Time Fiddle & Banjoby some young turks!"
    ]
  }

我在for concert in data:循环中处理了一堆看起来像这样的项目。在有两个这样的音乐会的日期,我需要创建一个新的Python字典,以便每个音乐会都在它自己的字典中,如下所示:

  {
    "website": "http://www.zebrawebworks.com/zebra/bluetavern/day.cfm?&year=2018&month=6&day=29", 
    "date": "2018-06-29", 
    "headliner": "Delta Ringnecks",  
    "data": [
      "4:00 PM", 
      "FEE:  $0", 
      "Jug Band Music", 
    ]
  },
  {
    "website": "http://www.zebrawebworks.com/zebra/bluetavern/day.cfm?&year=2018&month=6&day=29", 
    "date": "2018-06-29", 
    "headliner": "Flathead String Band"
    "data": [
      "8:00 PM", 
      "FEE:  $5", 
      "Old Time Fiddle & Banjoby some young turks!"
    ]
  }

有推荐的方法吗?我无法更改for循环本身的数据,对吧?因为那样会搞砸我的迭代。

我可以将它附加到data的末尾,以便for循环覆盖新的词典(我仍然需要在一切分开后解析一些数据)?

或者,我是否可以使用拆分日创建一个新词典,删除一天中的两个音乐会对象,然后合并我留下的词典?

我希望这是足够的信息,我不会过多地混淆术语。我是JSON Python模块的新手,并且一直在努力解决这个问题。谢谢。

python json
3个回答
1
投票

我建议您创建dict的副本并将每个特定数据存储在每个副本中。例如:

result = [] 

for pos in range(0, len(original_dict['headliner'])):
     new_dict = original_dict.copy()
     new_dict['data'] = original_dict['data'][pos*3:(pos+1)*3]
     new_dict['headliner'] = original_dict['headliner'][pos]
     result.append(new_dict)

print(result)

1
投票

你可以使用grouper文档中的itertools成语来获得一个非常干净的版本:

In [42]: new_list = [{'website': d['website'], 'date': d['date'], 'headliner': headliner, 'data': list(datarow)}
    ...:             for headliner, datarow in zip(d['headliner'], grouper(d['data'], 3))]
    ...:

In [43]: new_list
Out[43]:
[{'website': 'http://www.zebrawebworks.com/zebra/bluetavern/day.cfm?&year=2018&month=6&day=29',
  'date': '2018-06-29',
  'headliner': 'Delta Ringnecks',
  'data': ['4:00 PM', 'FEE:  $0', 'Jug Band Music']},
 {'website': 'http://www.zebrawebworks.com/zebra/bluetavern/day.cfm?&year=2018&month=6&day=29',
  'date': '2018-06-29',
  'headliner': 'Flathead String Band',
  'data': ['8:00 PM',
   'FEE:  $5',
   'Old Time Fiddle & Banjoby some young turks!']}]

0
投票

这是我提出的解决方案,感谢上面的nosklo的帮助。希望它可以帮助将来遇到类似问题的人。

new_concerts = []
    for concert in blue_data:

        if len(concert['headliner']) == 2:
            new_concert = concert.copy()
            new_concert['headliner'] = str(concert['headliner'][1])
            concert['headliner'] = str(concert['headliner'][0])
            mid = len(concert['data']) / 2
            new_concert['data'] = concert['data'][mid:]
            concert['data'] = concert['data'][0:mid]
            new_concerts.append(new_concert)

    blue_data = blue_data + new_concerts
© www.soinside.com 2019 - 2024. All rights reserved.