从列表中的项目创建字典

Posted

技术标签:

【中文标题】从列表中的项目创建字典【英文标题】:Creating dict from item in a list 【发布时间】:2021-05-31 00:37:12 【问题描述】:

我正在使用 robin_stocks 库中的 robinhood.options.get_option_market_data API 将有关股票期权的信息读入我的 Python 3 程序。

此 API 的文档表明它返回键/值对字典

robin_stocks.robinhood.options.get_option_market_data_by_id(id,info=None)

返回股票的期权市场数据,包括希腊指数、持仓量、利润变化和调整后的标记价格。Parameters•id(str) – 股票的 id。•info(Optional[str]) –将过滤结果以获取特定值。 返回股票的键/值对字典。如果提供了 info 参数,则提取与 info 匹配的键的值。 完整文档 - https://readthedocs.org/projects/robin-stocks/downloads/pdf/latest/

我使用以下代码检索有关此特定选项的信息。

price = rs.robinhood.options.get_option_market_data(ticker,'2021-06-11','260','call',info=None)
print(price[0])

打印出这个数据会返回:

['adjusted_mark_price': '0.400000', 'ask_price': '0.430000', 'ask_size': 49, 'bid_price': '0.370000', 'bid_size': 37, 'break_even_price': '260.400000', 'high_price': '0.710000', 'instrument': 'https://api.robinhood.com/options/instruments/70b3f0a9-3747-4cde-817e-07850f2d1a16/', 'instrument_id': '70b3f0a9-3747-4cde-817e-07850f2d1a16', 'last_trade_price': '0.390000', 'last_trade_size': 1, 'low_price': '0.380000', 'mark_price': '0.400000', 'open_interest': 2409, 'previous_close_date': '2021-05-27', 'previous_close_price': '0.470000', 'volume': 747, 'symbol': 'MSFT', 'occ_symbol': 'MSFT  210611C00260000', 'chance_of_profit_long': '0.092005', 'chance_of_profit_short': '0.907995', 'delta': '0.105930', 'gamma': '0.022910', 'implied_volatility': '0.177756', 'rho': '0.008438', 'theta': '-0.061925', 'vega': '0.082234', 'high_fill_rate_buy_price': '0.420000', 'high_fill_rate_sell_price': '0.370000', 'low_fill_rate_buy_price': '0.390000', 'low_fill_rate_sell_price': '0.400000']

但是,此代码似乎以列表第一个条目内的字符串形式返回此数据,而不是文档建议的字典。由于它不是字典,因此我无法发出 .get() 来检索我感兴趣的键/值对。任何以这种方式获取键/值对的尝试都会导致错误“属性错误:'list' 对象没有属性 'get'"

我对使用 Python 还是很陌生。将此字符串转换为键/值对字典的最佳方法是什么?在调用 robin_stocks API 之前,我尝试将价格定义为 price = dict(),但这似乎并没有奏效。将 API 更改为使用 info='ask_price' 或任何其他字段也会导致错误消息 - “错误:关键字“ask_price”不是字典中的键。”

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

它返回一个包含字典的列表列表,尽管它是一个列表列表,其中只有一个值,然后是一个值,至少来自您在 cmets 中提供的示例。


price= [['adjusted_mark_price': '0.400000', 'ask_price': '0.430000', 'ask_size': 49, 'bid_price': '0.370000', 'bid_size': 37, 'break_even_price': '260.400000', 'high_price': '0.710000', 'instrument': 'https://api.robinhood.com/options/instruments/70b3f0a9-3747-4cde-817e-07850f2d1a16/', 'instrument_id': '70b3f0a9-3747-4cde-817e-07850f2d1a16', 'last_trade_price': '0.390000', 'last_trade_size': 1, 'low_price': '0.380000', 'mark_price': '0.400000', 'open_interest': 2409, 'previous_close_date': '2021-05-27', 'previous_close_price': '0.470000', 'volume': 747, 'symbol': 'MSFT', 'occ_symbol': 'MSFT  210611C00260000', 'chance_of_profit_long': '0.092005', 'chance_of_profit_short': '0.907995', 'delta': '0.105930', 'gamma': '0.022910', 'implied_volatility': '0.177756', 'rho': '0.008438', 'theta': '-0.061925', 'vega': '0.082234', 'high_fill_rate_buy_price': '0.420000', 'high_fill_rate_sell_price': '0.370000', 'low_fill_rate_buy_price': '0.390000', 'low_fill_rate_sell_price': '0.400000']]

所以 ask_price 可以通过引用列表的索引值,然后是字典的键值来访问

在这种情况下

price[0][0]['ask_price']

如果打印出来

print(price[0][0]['ask_price'])

它会显示

49

【讨论】:

我改了代码来访问列表的索引,后跟键值对:price = rs.robinhood.options.get_option_market_data(ticker,'2021-06-11','260','call',info=None) print(price[0]['ask_price']) 这导致错误: print(price[0]['ask_price']) TypeError:列表索引必须是整数或切片,而不是 str 你能print(price) 告诉我返回的结果吗?你用的是什么代码? 我正在使用股票代码“MSFT”。 print(price) 返回与原始帖子中相同的数据,加上 1 组 []。 [['adjusted_mark_price': '0.400000', 'ask_price': '0.430000'.........]] (粘贴所有数据太长了) 所以实际返回的值是一个带有字典的列表的列表。我会更新我的答案。 嗯,有道理。它现在按预期打印 0.430000。谢谢乔!

以上是关于从列表中的项目创建字典的主要内容,如果未能解决你的问题,请参考以下文章

使用列表中的项目更改嵌套字典的字典中的值?

python 列表元组字典总结

Python中元组,列表,字典的区别

从 Python 中的 csv 创建字典中的字典列表

五 Python中元祖,列表,字典的区别

Python:如何从列表中的字典创建 DataFrame 列 [重复]