python - 大神们,求个算法
黄舟
黄舟 2017-04-18 09:17:38
[Python讨论组]

现有如下数据结构:

data = {
  "date": {
    "buckets": [
      {
        "key": "2015-01-01",
        "shop": {
          "buckets": [
            {
              "key": "A",
              "sum_qty": {
                "value": 5
              },
              "sum_amt": {
                "value": 10
              }
            }
          ]
        }
      },
      {
        "key": "2015-06-01",
        "shop": {
          "buckets": [
            {
              "key": "B",
              "sum_qty": {
                "value": 20
              },
              "sum_amt": {
                "value": 100
              }
            }
          ]
        }
      }
    ]
  }
}

最终结果:

lst = [
    {'date': '2015-01-01', 'shop': 'A', 'sum_qty': 5, 'sum_amt': 10},
    {'date': '2015-06-01', 'shop': 'B', 'sum_qty': 20, 'sum_amt': 100}
]
print lst
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(3)
高洛峰

寫了一個 class, 結果應該跟你要的一樣:

from collections import abc

class CoolJSON:

    def __init__(self, key, mapping):
        """
        key is the main key of this CoolJSON
        mapping is the total data
        """
        self.key = key
        self.mapping = dict(mapping)


    def collect_bucket_item(self, item):
        """ used to handle single bucket item"""
        dic = {}
        lst = [{}]

        for key, value in item.items():
            if key=='key':
                dic[self.key] = value
            elif isinstance(value, abc.MutableMapping):
                if 'buckets' in value:      
                    lst = CoolJSON(key, value).collect()
                elif 'value' in value:
                    dic[key] = value['value']

        for item in lst:
            item.update(dic)

        return lst


    def collect(self):
        """used to collect results from all bucket items"""
        results = []
        for item in self.mapping['buckets']:
            results.extend(self.collect_bucket_item(item))
        return results

測試:

# 測資使用 prolife 在評論下方新給的測資

lst = CoolJSON('date', data['date']).collect()

for item in lst:
    print(item)

結果:

{'sum_amt': 3651755, 'sum_qty': 36927, 'date': '2015-02-01', 'shop': 'A'}
{'sum_amt': 436019, 'sum_qty': 12115, 'date': '2015-02-01', 'shop': 'B'}
{'sum_amt': 1310549, 'sum_qty': 8896, 'date': '2015-02-01', 'shop': 'C'}
{'sum_amt': 18620841, 'sum_qty': 212909, 'date': '2015-03-01', 'shop': 'A'}
{'sum_amt': 5105368, 'sum_qty': 40109, 'date': '2015-03-01', 'shop': 'B'}
{'sum_amt': 938102, 'sum_qty': 28156, 'date': '2015-03-01', 'shop': 'C'}

我知道這可能不是你要的答案, 不過我不是很清楚你遇到的資料的狀況, 所以我先拋出一版, 再來看怎麼調整到可以處理你的需求, 以下是一個把這份資料想得很單純的無腦寫法:

lst = []

for item in data['date']['buckets']:
    dic = {}
    dic['date'] = item['key']
    dic['shop'] = item['shop']['buckets'][0]['key']
    dic['sum_qty'] = item['shop']['buckets'][0]['sum_qty']['value']
    dic['sum_amt'] = item['shop']['buckets'][0]['sum_amt']['value']
    lst.append(dic)

print(lst)

我回答過的問題: Python-QA

ringa_lee

好厉害,题目没看懂,答案也没看懂

巴扎黑
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号