python - 创建包含字典列表的字典列表
问题描述
我在试图围绕我一直在研究的这个问题上弯曲我的大脑时遇到了一些麻烦。我有一个从 SQLite 数据库中提取的股票数据列表。这是一个字典列表,字典看起来像这样:
[ {symbol:'AAPL', date:'2021-04-28', close:130},
{symbol:'AAPL', date:'2021-04-27', close:129},
{symbol:'MSFT', date:'2021-04-28', close:155},
{symbol:'MSFT', date:'2021-04-27', close:156} ]
我正在处理开盘价、最高价、最低价和收盘数据,我想编写一个脚本来为每个数据点/时间戳分配指标值。为了分配这些指标,我需要将这些数据操作到一个新列表中,如下所示:
Stock data = [ {'AAPL':[ {date:'2021-04-28', close:130},
{date:'2021-04-27', close:129} ] },
{'MSFT':[ {date:'2021-04-28', close:155},
{date:'2021-04-27', close:156} ] } ]
我想创建一个字典列表,键是股票代码,值是数据库中包含的所有 OHLC 数据(作为字典)的列表。
在我看来,这似乎是一个包含字典列表的字典列表。
我不担心效率,因为我只想在半夜每天运行一次。
解决方案
这可以通过itertools.groupby
一些后续操作来删除组密钥来完成。
from itertools import groupby
lst = [{'symbol': 'AAPL', 'date': '2021-04-28', 'close': 130},
{'symbol': 'AAPL', 'date': '2021-04-27', 'close': 129},
{'symbol': 'MSFT', 'date': '2021-04-28', 'close': 155},
{'symbol': 'MSFT', 'date': '2021-04-27', 'close': 156}]
group_key = 'symbol'
print([{k: [{sub_k: sub_v for sub_k, sub_v in d.items() if sub_k != group_key}
for d in v]}
for k, v in groupby(lst, key=lambda x: x[group_key])])
输出:
[{'AAPL': [{'date': '2021-04-28', 'close': 130},
{'date': '2021-04-27', 'close': 129}]},
{'MSFT': [{'date': '2021-04-28', 'close': 155},
{'date': '2021-04-27', 'close': 156}]}]
编辑:假设列表尚未按'symbol'
排序阶段排序是必要的:
from itertools import groupby
lst = [{'symbol': 'AAPL', 'date': '2021-04-28', 'close': 130},
{'symbol': 'MSFT', 'date': '2021-04-28', 'close': 155},
{'symbol': 'AAPL', 'date': '2021-04-27', 'close': 129},
{'symbol': 'MSFT', 'date': '2021-04-27', 'close': 156}]
group_key = 'symbol'
def get_key(x):
return x[group_key]
print([{k: [{sub_k: sub_v for sub_k, sub_v in d.items() if sub_k != group_key}
for d in v]}
for k, v in groupby(sorted(lst, key=get_key), key=get_key)])
输出:
[{'AAPL': [{'date': '2021-04-28', 'close': 130},
{'date': '2021-04-27', 'close': 129}]},
{'MSFT': [{'date': '2021-04-28', 'close': 155},
{'date': '2021-04-27', 'close': 156}]}]
推荐阅读
- vue.js - Vue js - 如何调试空窗口路由器?
- elasticsearch - 使用正则表达式的 Elasticsearch lucene 查询
- android - API 'variant.getExternalNativeBuildTasks()' 已过时并已替换为 'variant.getExternalNativeBuildProviders()
- oracle - WAS 和 IHS 8.5.5.x 在两个不同的操作系统级别上?
- html - 如何使用 CSS 使某个部分彼此完全对齐?
- javascript - 加载时增长动画
- mysql - 来自多个表的 SQL 语句
- java - 如何创建一个使用 Java 计算行进距离的循环?
- react-native - 将模态模式设置为特定屏幕
- c# - EventTrigger 未触发内容控件中的选择更改事件