如何迭代不相等的嵌套列表来创建一个新的列表Python

时间:2017-04-10 18:04:00

标签: python list loops for-loop nested-lists

我一直在迭代几个嵌套列表,以便使用Python模块Mibian来计算Call选项。

如果我使用mibian来计算欧洲看涨期权。

import mibian as mb

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


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

为了计算多个通话选项,首先,我创建一个范围。 如果我选择第一个嵌套列表my_list[0],并运行for - 循环。我得到了股票的所有看涨期权。

range_list = list(range(len(my_list)))
range_list
# [0, 1, 2]

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

    for i in my_list[0]:

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

        option2.append(c.callPrice)

option2

这给出了my_list中第一个嵌套列表的6个调用价格。

输出:

 [100.01095590221843,
  95.013694877773034,
  90.016433853327641,
  85.019172828882233,
  80.021911804436854,
  75.024650779991447]

我想弄清楚的是,我可以一次迭代所有嵌套列表,并获得一个新的嵌套列表列表,其中包含my_list[0]的调用选项价格,{{1} }和my_list[1]

对于所有三个嵌套列表,我想一次性输出这个输出。

输出:

my_list[2]

有人可以帮忙吗?我确信这很简单,我很想念。 非常感谢。 附:在这里编辑我的代码时,我无法正确缩进缩进。

2 个答案:

答案 0 :(得分:3)

让我们从您当前的方法开始:

range_list = list(range(len(my_list)))

data = dict()
for x in range_list:
    data[x] = option2 = []
    for i in my_list[0]:
        c = mb.BS([120, i, 1, 20 ], 10)
        option2.append(c.callPrice)

您应该注意的第一件事是enumerate同时获取索引和部分,因此您可以省略range_list变量:

data = dict()
for x, sublist in enumerate(my_list):
    data[x] = option2 = []
    for i in my_list[0]:
        c = mb.BS([120, i, 1, 20 ], 10)
        option2.append(c.callPrice)

这也解决了"动态索引"的问题。因为你可以迭代sublist

data = dict()
for x, sublist in enumerate(my_list):
    data[x] = option2 = []
    for i in sublist:
        c = mb.BS([120, i, 1, 20 ], 10)
        option2.append(c.callPrice)

然后你可以使用列表推导来替换内部循环:

data = dict()
for x, sublist in enumerate(my_list):
    data[x] = [mb.BS([120, i, 1, 20 ], 10).callPrice for i in sublist]

如果你觉得你想要这个更短(不推荐但有些喜欢它),那么使用dict理解而不是外部循环:

data = {x: [mb.BS([120, i, 1, 20 ], 10).callPrice for i in sublist] 
        for x, sublist in enumerate(my_list)}

答案 1 :(得分:0)

提供

my_nested_list = [[1,2,3], [4,5,6,7], [8,9]]
[i for i in my_nested_list]

返回

[[1, 2, 3], [4, 5, 6, 7], [8, 9]]

my_list = [[20, 25, 30, 35, 40, 45], [50, 52, 54, 56, 58, 60, 77, 98, 101],
      [30, 40, 50, 60]]    
[mb.BS([120, i, 1, 20 ], 10) for i in my_list]

会回复你的期望吗?