Python 如何使用另一个列表迭代嵌套列表以创建列表字典

Python 如何使用另一个列表迭代嵌套列表以创建列表字典,python,list,loops,dictionary,nested-lists,Python,List,Loops,Dictionary,Nested Lists,我使用Mibian模块来计算看涨期权。我有一个包含三个嵌套列表的列表。每个嵌套列表表示执行价格。每个嵌套列表都有各自的到期日,即my_列表[2]还有30天 import mibian as mb import pandas as pd my_list = [[20, 25, 30, 35, 40, 45], [50, 52, 54, 56, 58, 60, 77, 98, 101], [30, 40, 50, 60]] d

我使用Mibian模块来计算看涨期权。我有一个包含三个嵌套列表的列表。每个嵌套列表表示执行价格。每个嵌套列表都有各自的到期日,即my_列表[2]还有30天

     import mibian as mb
     import pandas as pd

     my_list = [[20, 25, 30, 35, 40, 45], 
       [50, 52, 54, 56, 58, 60, 77, 98, 101],
       [30, 40, 50, 60]]

     days_left = [5, 12, 30]

     my_list[2]
     [30, 40, 50, 60]

     days_left[2]
     30
用于计算看涨期权的Mibian Black-Scholes代码的结构

    mb.BS([stock price, strike price, interest rate, days to maturity], volatility)

     data1 = dict()
     for x, sublist in enumerate(my_list):
         data1[x] = option3 = []
         for i in sublist:
             c = mb.BS([120, i, 1, 20], 10)
             option3.append(c.callPrice)
给出了一个包含3个列表的字典的输出,调用价格基于my_列表中的三个嵌套列表中的每一个

        data1

         {0: [100.01095590221843,
              95.013694877773034,
              90.016433853327641,
              85.019172828882233,
              80.021911804436854,
              75.024650779991447],
         1: [70.027389755546068,
             68.028485345767905,
             66.029580935989742,
             64.030676526211579,
             62.03177211643343,
             60.032867706655267,
             43.042180223540925,
             22.05368392087027,
             19.055327306203068],
         2: [90.016433853327641,
             80.021911804436854,
             70.027389755546068,
             60.032867706655267]}
我试图得到的是嵌套列表和日期都要迭代在一起

我想用字典创建与上面相同的内容,但它不仅会重复我的列表,还会按顺序重复剩余的天数

我用new_list=list(zip(还剩几天,我的列表))尝试了一个zip列表,但它给了我一个错误。有人能帮忙吗?非常感谢

    new_list = list(zip(my_list, days_left))

    [([20, 25, 30, 35, 40, 45], 5),
     ([50, 52, 54, 56, 58, 60, 77, 98, 101], 12),
     ([30, 40, 50, 60], 30)]

    data5 = dict()
    for x, days_left, my_list in enumerate(new_list):
             data5[x] = option5 = []
             for days_left, my_list in new_list:
                           c = mb.BS([120, my_list, 1, days_left ], 10)
                           option5.append(c.callPrice)
对于单个嵌套列表,如my_list[2]。输出为:

    range_list = list(range(1))

data2 = dict()
for x in range_list:
data2[x] = option2 = []

for i in my_list[2]:

    c = mb.BS([120, i, 1, 30  ], 10)

    option2.append(c.callPrice)

option2


[90.024647403788975,
 80.032863205051967,
 70.041079006314973,
 60.049294807577965]

这些值类似,但与data1[2]中的值不同。理想的输出应该与data1具有相同的结构,有三个字典,但由于剩下的天数,值略有不同。这些差异可能看起来微不足道,但稍后,我将不得不将它们乘以100,这样这些差异就会累积起来

我想这正是你想要的。请注意,这大部分是为了模拟您的环境-您只关心最后几行

这就是说,由序列号索引的数据结构不应该是一个dict,它应该是一个列表

输出如下所示:

{0: [100.01095590221843,
     95.01369487777303,
     90.01643385332764,
     85.01917282888223,
     80.02191180443685,
     75.02465077999145],
 1: [70.02738975554607,
     68.0284853457679,
     66.02958093598974,
     64.03067652621158,
     62.03177211643343,
     60.03286770665527,
     43.042180223540925,
     22.05368392087027,
     19.05532730620307],
 2: [90.01643385332764,
     80.02191180443685,
     70.02738975554607,
     60.03286770665527]}

我认为答案可能很简单:

for x, (days_left, my_list) in enumerate(new_list):
     data5[x] = option5 = []
     for days_left, my_list in new_list:
          c = mb.BS([120, my_list, 1, days_left ], 10)
                    option5.append(c.callPrice)

因为
enumerate
的输出将采用
(i,x)
的形式,在这种情况下
x
是一个元组(即
(i,(x,y))
)。

输出应该是什么样的?嗨,Austin,它应该看起来像上面数据1中的字典,值应该类似,但要考虑剩下的天数。因此,例如,
range\u list=list(range(1))data2=dict()表示range\u list中的x:data2[x]=option2=[]表示我的列表中的i[2]:c=mb.BS([120,i,1,30],10)option2.append(c.callPrice)option2
输出值将类似于data1[2],
[90.024647403788975,80.032863205051967,70.041079006314973,60.049294807577965]
谢谢你的酷代码,Austin。不幸的是,它给出的值与我最初给出的值相同。我有点困惑为什么会这样:最后4行的值应该与
选项2
的值完全相同[90.024647403788975,80.032863205051967,70.041079006314973,60.049294807577965]
我写的代码只使用我从您那里复制和粘贴的数字。您是否将其与“真实”一起使用mb.BS函数,还是我提供的假函数?嗨,奥斯汀,我重新检查了你的代码,没有使用你创建的函数。我只使用了以data99开头的代码行,它工作了!真的很棒!:)谢谢你的帮助奥斯汀!嗨,奥卡斯布兰森,谢谢你的输入,很有意义,但似乎不起作用。继续获取
TypeError:float()参数必须是一个字符串或数字,而不是一个“列表”
已为此工作了近3天,因此可能会放弃,继续前进。感谢您的帮助。听起来问题似乎出在
cm.BS
的一个输入中,但无法从该信息中分辨出来。请尝试在开始之前分离循环并将其打印为参数当它运行时,您可以找出它失败的地方,以及它传递给函数的参数。
for x, (days_left, my_list) in enumerate(new_list):
     data5[x] = option5 = []
     for days_left, my_list in new_list:
          c = mb.BS([120, my_list, 1, days_left ], 10)
                    option5.append(c.callPrice)