首页 > 解决方案 > 如何在没有 for 循环的情况下将 itertools 组合作为列表列表

问题描述

我试图让一个itertools.combinations返回函数内的列表列表,但是我的代码返回一个元组列表......

array = list(combinations(a, m))

returns:

[(1, 2), (1, 3), (2, 3)]

我可以通过使用 for 循环来获得所需的输出:

  array1 = []
  for i in array:
      array1.append(list(i))
  return array1

returns:

[[1, 2], [1, 3], [2, 3]]

但是我不想在函数中使用 for 循环,因为还有其他 for 循环,我想缩短时间复杂度。

如何在itertools.combinations不使用 for 循环的情况下获取此列表列表?在列表理解中使用循环也会增加时间。我在 SO 帖子或 python 网站上找不到我想要的答案。

标签: pythonitertools

解决方案


渐近复杂度将始终保持不变。您将无法绕过将每个组合转换为列表。你可以懒惰地这样做:

from itertools import combinations

def list_combs(iterable, k): 
    return map(list, combinations(iterable, k))

您现在可以将list_combs其用作 的替代品combinations,列表转换开销仅在使用下一个组合时才延迟应用。

for c in list_combs([1, 2, 3], 2):
    print(c)

[1, 2]
[1, 3]
[2, 3]

推荐阅读