gpt4 book ai didi

python - 将 Python 列表组合在一起以获得公共(public)元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:14:12 25 4
gpt4 key购买 nike

我正在为每个不同国家/地区的 session 和用户查询 Google Analytics(分析)数据。我想每天将这些数据保存在我的数据库中,以便以后访问。

我的查询返回了一个非常大的 json,我正试图找到最佳解决方案以最大限度地提高速度。

首先,我设法取回了按 session 排序的数据,这意味着我现在只能在我的数据库中保存前 10 个国家,而无需每天为每个国家保存一个新行。

我认为这是获得有值(value)信息所需的最少数据量。所以现在我构建了我的 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'
}]
}
}
}]
}

我想弄清楚如何提取每天 session 最多的前 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,是否有更简单的方法来完成此操作?如果我如何根据第一个值将列表分组在一起,然后如何按 session 排序?

谢谢!

最佳答案

当每天没有重复的国家时。你可以使用 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)

这会返回一个字典,让您可以轻松地迭代:

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)

关于python - 将 Python 列表组合在一起以获得公共(public)元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43619557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com