如何过滤这个Python字典来制作2个新字典?

Sca*_*eta 1 python dictionary

这是我的示例输入字典

dct={'48689': 'FINNIFTY02JAN24C20900', '46624': 'FINNIFTY09JAN24P20900', '40811': 
'NIFTY14DEC23C20750', '40812': 'NIFTY14DEC23P20750', '40813': 'NIFTY14DEC23C20800', '40814': 
'NIFTY14DEC23P20800', '40817': 'NIFTY14DEC23C20850', '40818': 'NIFTY14DEC23P20850', '40828': 
'NIFTY14DEC23C20900', '40832': 'NIFTY14DEC23P20900', '40834': 'NIFTY14DEC23C20950', '40839': 
'NIFTY14DEC23P20950'}
Run Code Online (Sandbox Code Playgroud)

我想根据以下条件制作两个新词典dict_Pdict_C :

  • 如果相应的 dct 值中有“23C2”或“23C1”或“24C1”或“24C2”,则相应的键、值将分配给 dict_C

  • 如果相应的 dct 值中有“23P2”或“23P1”或“24P2”或“24P1”,则相应的键、值将分配给 dict_P

预期输出:

dict_C - 
    {'48689': 'FINNIFTY02JAN24C20900', '40811': 
    'NIFTY14DEC23C20750','40813': 'NIFTY14DEC23C20800', '40817': 'NIFTY14DEC23C20850','40828': 
    'NIFTY14DEC23C20900','40834': 'NIFTY14DEC23C20950'}

dict_P - 
    { '46624': 'FINNIFTY09JAN24P20900', '40812': 'NIFTY14DEC23P20750', '40814': 
    'NIFTY14DEC23P20800', '40818': 'NIFTY14DEC23P20850', '40832': 'NIFTY14DEC23P20900', '40839': 
    'NIFTY14DEC23P20950'}
Run Code Online (Sandbox Code Playgroud)

我确实提出了非常简单的基于新手列表的解决方案,如下所示:

    strike_list = []
    CE_list = []
    PE_list = []
    strike_list = list(dct.values())

    arrC = ["23C1", "23C2", "24C2", "24C1"]
    arrP = ["23P1", "23P2", "24P2", "24P1"]
    for i in strike_list:
        for j in arrC:
            if j in i:
                CE_list.append(i)
    print( CE_list)

    for i in strike_list:
        for j in arrP:
            if j in i:
                PE_list.append(i)
    print(PE_list)
Run Code Online (Sandbox Code Playgroud)

它有效,但我想要2 个字典(而不是列表),其中具有key:value如上所述的相应对。

Bar*_*mar 5

不要转换dct为列表,而是使用 迭代键和值dct.items()。然后,您可以将键和值添加到结果字典之一。

使用any()而不是循环来判断它是否与过滤器列表之一匹配。

dict_C = {}
dict_P = {}
arrC = ["23C1", "23C2", "24C2", "24C1"]
arrP = ["23P1", "23P2", "24P2", "24P1"]

for key, value in dct.items():
    if any(x in value for x in arrC):
        dict_C[key] = value
    elif any(x in value for x in arrP):
        dict_P[key] = value
Run Code Online (Sandbox Code Playgroud)