从列表中的项目创建字典
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。谢谢乔!以上是关于从列表中的项目创建字典的主要内容,如果未能解决你的问题,请参考以下文章