簡體   English   中英

列出所有可能的組合

[英]Listing all possible combinations

我想知道您是否可以幫我解決這個問題。

我有以下代碼代表數字范圍的所有可能組合:

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

你能幫我嗎? 即使自己編輯提供的代碼?

預先感謝一百萬

您的問題與實際生成組合完全不同。 您想要的只是一種輸出數據的特殊方式。 使用標准的文件編寫工具,您可以輕松地做到這一點:

>>> 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')
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不太大,也會有很多文件。 在這種情況下,即使磁盤空間是足夠大的,有可能是其不喜歡在一個目錄有太多的文件的文件系統有問題。 因此,將它們放在不同的目錄中(明智的做法是稍微修改一下代碼)可能是明智的選擇,或者最好使用另一種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM