【问题标题】:How to iterate unequal nested lists to create a new list Python如何迭代不相等的嵌套列表以创建新列表 Python
【发布时间】:2017-04-10 18:04:00
【问题描述】:

为了使用 Python 模块 Mibian 计算看涨期权,我一直在迭代多个嵌套列表。

如果我使用 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-loop。我得到了股票的所有看涨期权。

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]my_list[1] 和 @ 的看涨期权价格的嵌套列表的新列表987654329@.

我希望对所有三个嵌套列表一次性输出此输出。

输出:

 [[100.01095590221843,    [70.027389755546068,    [90.016433853327641,
  95.013694877773034,     68.028485345767905,     80.021911804436854, 
  90.016433853327641,     66.029580935989742,     80.021911804436854,
  85.019172828882233,     64.030676526211579,     70.027389755546068,
  80.021911804436854,     62.03177211643343,      ]]
  75.024650779991447]     60.032867706655267,
                          43.042180223540925,
                          22.05368392087027,
                          19.055327306203068]

有人可以帮忙吗?我敢肯定,我错过了一些非常简单的事情。 非常感谢。 附言在这里编辑我的代码时,我无法正确缩进。

【问题讨论】:

  • 请编辑您的问题,stackoverflow.com/help/mcve
  • 感谢您的链接,Bhansa。我已经编辑了它,但是如果我编辑得太多,它会丢失很多与问题有关的信息。遗憾的是,我仍然在这个问题上投了反对票。
  • 这有点令人困惑。 IIUC,摆脱range_list = list(range(len(my_list)))for x in range_list:data[x] = option2 = []for i in my_list[0]:。用嵌套缩进替换 for i in my_list: for j in i: c = mb.BS([120, j, 1, 20 ], 10)。这是朝着你的目标前进吗?对于你想要做的事情,我是否符合正确的路线?
  • 为什么my_list[2] 包含 4 个元素,而预期回报却有 5 个?
  • 您好 MSeifert,哦,感谢您指出这一点。这只是我编辑的一个错误。您指的是 my_list[2] 中的最后一行,60.03286 .....,它实际上只是我复制和粘贴时 my_list[1] 的副本。我会编辑一下,谢谢。

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


【解决方案1】:

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

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同时获取索引和part,所以可以省略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)}

【讨论】:

  • 很好的返工!打败我。但是我是否遗漏了什么,callPrice 方法呢?
  • @Parfait 你说得对,我错过了。我编辑了代码,现在应该是正确的。
  • 哦,哇!谢谢你MSeifert!并感谢所有提供帮助的人! :) 我已经为此苦苦挣扎了几天,很累。因此,我发布了一个最初混乱的问题。所以你在字典中创建了一个列表,非常酷!希望可以帮助其他人迭代嵌套循环和/或计算选项。
  • @MichaelRSF 我很好奇您为什么接受了另一个似乎根本无法解决您的问题的答案。您的 initial 代码也会尝试创建字典。
  • 嗨,rogan,我还是 Python 的新手。我大约1-2个月前才开始使用它。当我创建字典时,我无法获取计算出的调用价格的嵌套循环。其他时候,数据字典很乱。是的,我不接受不正确的答案。另外,我对字典没有那么先进。
【解决方案2】:

前提是

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]

会返回您期望的结果吗?

【讨论】:

  • 据我了解,您需要嵌套迭代。一种是访问子列表,然后是访问子列表中的各个值。
  • 另外,还有一个callPrice 方法。
猜你喜欢
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多