【问题标题】:Python - Generating/iterating a combinationPython - 生成/迭代组合
【发布时间】:2015-11-02 18:22:42
【问题描述】:

首先我想说的是,我对 Python 还很陌生,并且对一般的编码非常感兴趣。我对基本概念有些熟悉,但 Python 中专门使用的函数对我来说很大程度上是未知的。首先我是一个视觉/体验学习者。

我还想立即声明,如果这个问题已被提出并已得到回答,我深表歉意。我发现了很多“类似”的问题,但没有一个能真正帮助我找到解决方案。

问题

正如我的主题标题中所述,我有兴趣将 nCr 的“输出”(正确的术语?)创建到列表中,或者查看它的最佳方法。

10选5。这10个变量可以是数字、字母、名字、单词等。组合没有重复,也没有顺序。

研究

我想说的是,我查看过类似的主题 question/answer 并发现这些概念很有帮助,但在示例代码中发现了这一点:

    from itertools import izip

    reduce(lambda x, y: x * y[0] / y[1], izip(xrange(n - r + 1, n+1), xrange(1, r+1)), 1)

reduce 工具/功能不再以这种方式使用。我想我读到它从 Python 3 开始更改为 functools

问题

如何更新/更改上述代码(示例很有帮助)或任何其他代码以适应减少?有没有其他方法可以输出组合结果?

***Edit*** 我想我没有清楚地将 ProblemQuestion 标题的内容联系起来。基本上我的主要问题是在 Problem 标题下。虽然了解一个人如何使用 itertools 从列表中进行组合很有帮助,但我不知道如何输出 10 选择 5。:\

【问题讨论】:

  • reduce 曾经是一个内置函数。它现在是 functools 包中的一个函数。其他任何事情都不应该改变。 Python3 中的等效行是导入from functools import reduce 之后的reduce(lambda x, y: x * y[0] / y[1], zip(range(n - r + 1, n+1), range(1, r+1)), 1)。注意izip -> zipxrange -> range的变化
  • 您能否举例说明您希望输出的样子?
  • 我正在寻找类似的东西:Variables are 1/a/2/b/3/c/4/d/5/e output is 1a2b3, 1a2bc, 1a2b4... 等等。

标签: python combinations


【解决方案1】:

你想做什么:

>>> import itertools
>>> for combination in itertools.combinations('ABCDEFGHIJ', 5):
>>>    print(''.join(combination))
ABCDE
ABCDF
ABCDG
ABCDH
ABCDI
ABCDJ
ABCEF
ABCEG
ABCEH
ABCEI

如果是这样,它就完成了。如果您想学习如何自己实现combinations 函数,那么您很幸运,因为itertools.combinations documentation 提供了一个实现。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 2011-10-14
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多