组Python列出了共同元素

时间:2017-04-25 19:40:30

标签: python json algorithm postgresql sorting

我正在查询每个不同国家/地区的会话和用户的Google Analytics数据。我希望每天在我的数据库中保存这些数据,以便以后可以访问它。

我的查询给了我一个非常大的json回来,我试图找到最佳速度的最佳解决方案。

首先,我设法取回了会话订购的数据,这意味着我现在只能保存我的数据库中的前10个国家/地区,而不是每天为每个国家/地区保存新行。

我认为这是获取有价值信息所需的最少数据量。所以现在我构建了我的bd来接受这样的数据:

20170101 | US | 112 (sessions) | 111 (users)
20170101 | CA | 111 (sessions) | 221 (users)
... (for 8 more rows)
20170102 | US | 11 (sessions) | 22 (users)
... (and so on, so 10 rows per day)

现在我回来的大json看起来像这样(我在中间删除了很多指标):

m = {
'reports': [{
    'data': {
        'rowCount': 2003,
        'maximums': [{
            'values': ['1219', '1109']
        }],
        'minimums': [{
            'values': ['1', '1']
        }],
        'totals': [{
            'values': ['33505', '30382']
        }],
        'rows': [{
            'dimensions': ['20170404', 'US'],
            'metrics': [{
                'values': ['1219', '1091']
            }]
        }, {
            'dimensions': ['20170406', 'US'],
            'metrics': [{
                'values': ['1203', '1109']
            }]
        }, {
            'dimensions': ['20170405', 'US'],
            'metrics': [{
                'values': ['1185', '1073']
            }]
        }, {
            'dimensions': ['20170408', 'PL'],
            'metrics': [{
                'values': ['2', '1']
            }]
        }, {
            'dimensions': ['20170408', 'SG'],
            'metrics': [{
                'values': ['2', '2']
            }]
        }, {
            'dimensions': ['20170408', 'TT'],
            'metrics': [{
                'values': ['2', '2']
            }]
        }]
    },
    'nextPageToken': '1000',
    'columnHeader': {
        'dimensions': ['ga:date', 'ga:countryIsoCode'],
        'metricHeader': {
            'metricHeaderEntries': [{
                'name': 'ga:sessions',
                'type': 'INTEGER'
            }, {
                'name': 'ga:users',
                'type': 'INTEGER'
            }]
        }
    }
}]
}

我试图找出如何提取每天会话最多的前10个国家/地区并将此信息保存在我的数据库中,到目前为止我想出了:

x = m['reports'][0]['data']['rows']

l =[]
for data in x:
    date = data['dimensions'][0]
    country = data['dimensions'][1]
    sessions = data['metrics'][0]['values'][0]
    users = data['metrics'][0]['values'][1]
    n = [date, [country,sessions, users]]
    l.append(n)

这会生成一个列表,其中包含格式为[date[country, sessions, users]]

的内部值

这样的事情:

[['20170404', ['US', '1219', '1091']],
 ['20170406', ['US', '1203', '1109']],
 ['20170405', ['US', '1185', '1073']],
 ['20170408', ['PL', '2', '1']],
 ['20170408', ['SG', '2', '2']],
 ['20170408', ['TT', '2', '2']]]

现在我想嵌套另一个for循环来检查日期,如果它相同,它会将值z[1]添加到同一个列表中,所以对于每个日期我都会有一个列表与每个国家的价值观。但是,我不确定如何根据第一个值z[0]将这些字典组合在一起加上这将对所有国家/地区进行分组,而不仅仅是前10个国家/地区。

鉴于上面的大json,是否有更简单的方法来实现这一目标?如果我如何根据第一个值将列表组合在一起以及如何按会话排序?

谢谢!

1 个答案:

答案 0 :(得分:1)

每天没有重复的国家/地区。您可以使用defaultdicts来管理不同级别的分组(神奇地):

import pprint
from collections import defaultdict

def recursive_defaultdict():
    return defaultdict(recursive_defaultdict)

l = recursive_defaultdict()

x = m['reports'][0]['data']['rows']

for data in x:
    date = data['dimensions'][0]
    country = data['dimensions'][1]
    sessions = data['metrics'][0]['values'][0]
    users = data['metrics'][0]['values'][1]

    l[date][country] = {'sessions': sessions, 'users': users}

pprint.pprint(l)

这会返回一个dict,允许您轻松迭代:

defaultdict(<function recursive_defaultdict at 0x7f3ecfb45e18>,
            {'20170404': defaultdict(<function recursive_defaultdict at 0x7f3ecfb45e18>,
                                     {'US': {'sessions': '1219',
                                             'users': '1091'}}),
             '20170405': defaultdict(<function recursive_defaultdict at 0x7f3ecfb45e18>,
                                     {'US': {'sessions': '1185',
                                             'users': '1073'}}),
             '20170406': defaultdict(<function recursive_defaultdict at 0x7f3ecfb45e18>,
                                     {'US': {'sessions': '1203',
                                             'users': '1109'}}),
             '20170408': defaultdict(<function recursive_defaultdict at 0x7f3ecfb45e18>,
                                     {'PL': {'sessions': '2', 'users': '1'},
                                      'SG': {'sessions': '2', 'users': '2'},
                                      'TT': {'sessions': '2', 'users': '2'}})})

要接收日期/国家/地区的特定组合:

print (l['20170404']['US'])
>>> {'sessions': '1219', 'users': '1091'}

迭代结果:

for date, values in l.items():
    for country, value in values.items():
        print (date, country, value)