我想知道你是否可以帮我解决这个问题。
我有以下代码来表示所有可能的数字范围组合:
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)。
你能帮我解决这个问题吗?即使编辑提供的代码本身?
百万提前感谢
答案 0 :(得分: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')
答案 1 :(得分: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中定义,但描述了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,也会有很多文件。在这种情况下,即使磁盘空间足够大,文件系统也可能存在问题,该文件系统不会喜欢在目录中有太多文件。因此,将它们放在不同的目录(需要稍微调整代码)或更好的方法,以采用另一种方法可能是明智的。