2

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

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

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)。

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

百万提前感谢

4

2 回答 2

0

您的问题与实际生成组合完全不同。您想要的只是一种输出数据的特殊方式。您可以使用标准文件写入内容轻松完成此操作:

>>> 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')
于 2013-01-17T10:26:07.567 回答
0
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中定义,但在此处描述(在页面中查找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 不太大,也会有很多文件。在这种情况下,即使磁盘空间足够大,文件系统也可能存在问题,不喜欢目录中有太多文件。因此,明智的做法是将它们放在不同的目录中(这需要稍微调整代码),或者更好地采用另一种方法。

于 2013-01-17T10:27:17.813 回答