【问题标题】:Flatten nested for loop with dependent variables用因变量展平嵌套的 for 循环
【发布时间】:2017-05-25 17:25:23
【问题描述】:

我想表演:

for i in list_a:
    for j in list_b[i]:
        print(i, j)

是否可以使用 itertools 来做到这一点? 我正在寻找类似的东西:

for i, j in itertools.product(list_a, list_b[i])

我想这样做是为了速度和可读性。

【问题讨论】:

  • 我认为不可能以任何提高速度或可读性的方式将其展平。在我看来,嵌套方法是最自然且最有效的方法。您可以通过将其编写为列表推导式或生成器表达式将其全部写在一个物理行上,例如:[ call_some_function(i,j) for i in list_a for j in list_b[i] ],但这基本上仍然是一个嵌套的 for 循环。
  • 好的,但是最快的方法是什么,编写一个列表推导式并使用函数对其进行迭代,或者创建一个产生某些内容并对其进行迭代的函数?
  • 如果你想要一个列表,使用列表推导。如果你想要一个生成器,请使用生成器表达式:stuff = (call_some_function(i, j) for i in list_a for j in list_b[i]) 然后你可以在不浪费内存的情况下懒惰地迭代它:for thing in stuff: do_some_more_stuff(thing)
  • 不过,纯 for 循环方法可能比使用生成器表达式更快。但是列表推导可能比等效的 for 循环稍快。
  • 非常感谢您的帮助

标签: python for-loop nested-loops


【解决方案1】:

itertools 在大多数情况下不会为您提供速度(但会为您提供稳定性并节省您的时间,因此请尽可能使用它)就可读性和速度而言 - 没有什么比列表理解更好:

your_list = [(i, j) for i in list_a for j in list_b[i]]

然后你可以打印它,如果你愿意:)

【讨论】:

  • 好的,谢谢,如果我想做比打印更复杂的事情,我想我必须创建一个函数并将其传递给列表(或生成器)?
  • 是的,如果您需要从该函数收集响应,您可以在生成器中调用您的函数,而不是创建元组。否则,生成器除了在一行中并产生不需要的 list 之外没有任何意义。
猜你喜欢
  • 1970-01-01
  • 2019-12-19
  • 2018-12-25
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多