【问题标题】:How to make 3 pairs of sub-lists from a Python list如何从 Python 列表中创建 3 对子列表
【发布时间】:2019-03-24 11:51:36
【问题描述】:

在 Python 中有没有办法从列表中获取所有 3 对或 n 对列表?

例如列表 = [1,2,3,4]
结果:[[1,2,3],[2,3,4],[1,2,4]]

我想从 Python 列表中找到所有可能的 n 对列表。我不想导入任何其他函数,例如 itertools。

【问题讨论】:

  • 我不明白你的意思。你能更好地解释一下自己吗?
  • 欢迎来到 Stack Overflow!请收下我们的tour,我保证只需要一分钟。然后,如果您有时间,请查看我们的help center 以更好地了解网站本身。
  • 我想从一个列表中找到所有可能的 n 对列表。从我的示例中,我想从列表 [1,2,3,4] 中找到所有可能的 3 对列表,然后结果将是 [[1,2,3],[2,3,4],[1,2, 4]]

标签: python-3.x


【解决方案1】:

您可以使用模块itertools。它默认包含在 Python 中(您不需要通过第三方模块安装它):

>>> import itertools
>>> print(itertools.permutations([1,2,3,4], 3))
[(1, 2, 3), (1, 2, 4), (1, 3, 2), (1, 3, 4), (1, 4, 2), (1, 4, 3), (2, 1, 3), (2, 1, 4), (2, 3, 1), (2, 3, 4), (2, 4, 1), (2, 4, 3), (3, 1, 2), (3, 1, 4), (3, 2, 1), (3, 2, 4), (3, 4, 1), (3, 4, 2), (4, 1, 2), (4, 1, 3), (4, 2, 1), (4, 2, 3), (4, 3, 1), (4, 3, 2)]

itertools.permutations(iterable, r=None) 生成给定可迭代元素(如列表)的所有可能排列。如果r 未指定或为None,则r 默认为可迭代的长度,并生成所有可能的全长排列。

如果您只寻找n pair 的排列而不是所有可能的排列,只需删除其余的排列:

>>> print(list(itertools.permutations([1,2,3,4], 3))[:3])
[(1, 2, 3), (1, 2, 4), (1, 3, 2)]

正如您在 cmets 中所要求的,您可以在不导入任何模块的情况下做到这一点。 itertools.permutations只是一个函数,你可以自己制作:

def permutations(iterable, r=None):
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return
    indices = list(range(n))
    cycles = list(range(n, n-r, -1))
    yield tuple(pool[i] for i in indices[:r])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return

但我强烈建议您导入它。如果不想导入整个模块,只需要这个函数就可以了from itertools import permutations

【讨论】:

  • 在不导入某些功能的情况下还有其他方法吗?
  • @eumsangwon 当然,只需自己复制该函数的代码即可。我已经在我的帖子中发布了它的代码,但我强烈建议你导入这个模块。如果您不喜欢导入整个库,只需导入这个执行from itertools import permutations 的函数即可。然后您可以将其用作permutations(myList)
  • @eumsangwon 请问你为什么不想导入它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2017-11-15
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多