【问题标题】: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”不是字典中的键。”

任何帮助将不胜感激!

【问题讨论】:

    标签: python list dictionary


    【解决方案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。谢谢乔!
    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2019-05-25
    • 1970-01-01
    • 2017-05-05
    • 2020-03-02
    相关资源
    最近更新 更多