【问题标题】:Listing all possible combinations列出所有可能的组合
【发布时间】:2013-01-17 10:14:31
【问题描述】:

我想知道你是否可以帮我解决这个问题。

我有以下代码来表示数字范围的所有可能组合:

import itertools
lst = [1, 2, 3]
combs = []
for i in xrange(1, len(lst)+1):
   els = [list(x) for x in itertools.combinations(lst, i)]
   combs.extend(els)

问题是它以

的形式表示输出
[[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

在单独的文本文件中表示每个组合对我来说将是非常有益的。每个文本文件在一行中表示组合中的每个数字。如 (1,2),1 在第一行,2 在第二行,不加逗号。

非常感谢您对我的帮助。

编辑

感谢百万人的帮助。感激不尽。

我还有一个小问题要在这里解决。

对于 Poke 解决方案,这很棒,但有一个小问题(我的说明错误)

文件的输出是:

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

问题是我需要将代码用于大量组合 (6-39)。

你能帮我解决这个问题吗?即使编辑提供的代码本身?

提前百万感谢

【问题讨论】:

  • 请不要为您的问题提供更多信息的答案,而是编辑您的问题。我已将新信息添加到问题中,并将您的答案标记为删除。
  • 那么,你真的想要有多个文件,还是只有一个文件,所有组合都在第 1 行,所有单元素组合,所有 2 元素组合在第 2 行,...?
  • 因为我可能有大量的组合。最好分配组合变量以从文件中获取整个组合。对于输出,它将如前所述。因此,您的代码是唯一的,但我可以从文件中分配组合变量。谢谢!
  • 您打算如何处理这些文件?如果它们的数量很大,可能会有更好的方法来解决您的问题。
  • @arbautjc 好的。我需要实现的是我需要找到范围 [6-39] 的所有可能组合。然后,对于每个组合都应该写在一个单独的文件中。每个文件在单独的行中都有组合编号(如前所述)。这些文件和数字需要由我设计的程序访问。请帮助我。谢谢!

标签: python combinations itertools


【解决方案1】:

您的问题与实际生成组合完全不同。您想要的只是一种输出数据的特殊方式。你可以使用标准的文件编写工具轻松地做到这一点:

>>> combinations = [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
>>> for i, combination in enumerate(combinations):
        with open(r'C:\Users\poke\Desktop\foobar\{0}.txt'.format(i), 'w+') as f:
            for value in combination:
                f.write(str(value) + '\n')

【讨论】:

  • 您的代码假定所有组合都存储在内存中,这是可以避免的。遗憾的是,没有第二个参数的 itertools.combinat([1,2,3]) 不会生成所有这些。
  • 嗨戳,请您检查我上面的帖子。谢谢!
  • @arbautjc 我的代码还假设 OP 使用的是 Windows,有一个名为 poke 的用户,并且桌面上存在一个名为 foobar 的文件夹。我的代码就是一个例子; OP 已经证明他能够生成组合,问题是如何以所需的方式编写文件。
  • @poke 我不是故意冒犯你的。由于可能有多种组合,并且磁盘空间可能比内存空间大得多,因此提及似乎是明智的。
  • @arbautjc 别担心,没有冒犯;只是我并不总是想抛出完美的解决方案,以至于人们实际上不能只是 1:1 复制它而不必自己考虑:)
【解决方案2】:
import itertools

def savecomb(a, basename):
    k = 0
    for n in range(1, len(a) + 1):
        for c in itertools.combinations(a, n):
            k += 1
            f = open("{}{}.txt".format(basename, k), "wt")
            for i in c:
                f.write("{}\n".format(i))
            f.close()

还有另一种解决方案,使用powerset,在itertools中没有定义,但是描述了here(在页面中寻找powerset):

def powerset(iterable):
    s = list(iterable)
    return itertools.chain.from_iterable(itertools.combinations(s, r) for r in range(len(s)+1))

def savecomb(a, basename):
    for k, c in enumerate(powerset(a)):
        with open("{}{}.txt".format(basename, k), "wt") as f:
            for i in c:
                f.write("{}\n".format(i))

这是可行的,因为采用所有尺寸的组合与采用列表的所有子集完全相同。会有一个空文件,占空子集。

另外,请记住,有 2^n 个子集,其中 n 是列表的大小,因此即使 n 不太大,也会有很多文件。在这种情况下,即使磁盘空间足够大,文件系统也可能会出现问题,喜欢目录中有太多文件。因此将它们放在不同的目录中可能是明智的(这需要稍微调整代码),或者更好地采用另一种方法。

【讨论】:

  • savecomb([1,2,3], "bob") 会在 bob1.txt, bob2.txt ... bob7.txt 中保存 7 个组合
猜你喜欢
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2011-12-09
相关资源
最近更新 更多