Python实时循环更新选中期权LTP及去除显示大括号的方法
问题:实时更新期权LTP时显示带大括号的集合,如何去除?
我有两个字典:
gData = {'43506': '88.70', '43507': '138.60', '43500': '112.60', '43499': '112.95', '41708': '141.50', '41709': '91.00'} PE_dict = {'43507': 'NIFTY21DEC23P21500', '43500': 'NIFTY21DEC23P21450', '41709': 'NIFTY21DEC23P21400'}
其中gData以token为键、LTP(最新成交价)为值,PE_dict以token为键、期权合约代码为值。
我通过WebSocket在无限循环中实时更新gData,同时用Tkinter的OptionMenu绑定PE_dict的期权合约代码。原本切换选项时只能获取一次对应LTP,无法实时更新;修改live_feed函数后实现了实时更新,但pe_ltp以集合形式显示带有大括号{},请问如何去除这些大括号?
修改后的live_feed代码:
def live_feed(): print("Inside live_feed function") # api.subscribe() global myLabel1 global pe_ltp while not exitProgram: print() print(gData) print("Length of gData - ", len(gData)) var = gData myLabel1.config(text=var) pe_token = list({k for k, v in PE_dict.items() if v == clicked_PE.get()}) pe_ltp = {v for k, v in gData.items() if k == pe_token[0]} selected_PE_Strike.config(text=pe_ltp) time.sleep(0.15)
问题原因
你使用了集合推导式{v for k, v in gData.items() if k == pe_token[0]}生成pe_ltp,集合的默认字符串表示自带大括号,所以显示时会出现{}。
解决方法
因为每个token在gData中对应唯一的LTP,完全不需要用集合,直接通过键取值即可:
修改这两行代码:
pe_token = list({k for k, v in PE_dict.items() if v == clicked_PE.get()}) pe_ltp = {v for k, v in gData.items() if k == pe_token[0]}
替换为:
# 从PE_dict中匹配对应合约的token(合约代码唯一,用next直接取第一个匹配项) pe_token = next(k for k, v in PE_dict.items() if v == clicked_PE.get()) # 直接通过token从gData中获取LTP,加默认值避免KeyError pe_ltp = gData.get(pe_token, "N/A")
标签更新代码保持不变:
selected_PE_Strike.config(text=pe_ltp)
额外优化
- 原代码用集合推导式转列表获取
pe_token完全没必要,因为每个合约代码在PE_dict中对应唯一token,用next()直接获取更高效简洁。 - 用
gData.get()替代直接索引gData[pe_token],可以防止当token不在gData中时抛出KeyError,提升代码稳定性。
内容的提问来源于stack exchange,提问作者Scalper Vegeta
相关产品推荐
相关产品推荐

