簡體   English   中英

如何生成給定長度和元素總和的所有元組的集合?

[英]How to generate a set of all tuples of given length and sum of elements?

我想要一個函數,該函數生成具有給定長度和元素總和的所有可能元組的集合(或列表)。 元組的元素不能為負整數。

例如以下輸入

get_tuple(length=3, total=2)

我想得到以下輸出:

[(1, 0, 1), (2, 0, 0), (1, 1, 0), (0, 0, 2), (0, 1, 1), (0, 2, 0)]

Python中的標准庫可以做到嗎? 如果沒有,如何編寫一個可以做到的功能?

您可以創建一個遞歸函數,避免創建所有候選組合並檢查其和:

def get_tuples(length, total):
    if length == 1:
        yield (total,)
        return

    for i in xrange(total + 1):
        for t in get_tuples(length - 1, total - i):
            yield (i,) + t

如果我們測試:

>>> list(get_tuples(3, 2))
[(0, 0, 2), (0, 1, 1), (0, 2, 0), (1, 0, 1), (1, 1, 0), (2, 0, 0)]

您可以使用itertools.product獲得所有數字的乘積,然后使用過濾器功能選擇具有指定總和的乘積:

>>> def get_tuple(length, total):
...     return filter(lambda x:sum(x)==total,product(range(total+1),repeat=length))
... 
>>> get_tuple(3, 2)
[(0, 0, 2), (0, 1, 1), (0, 2, 0), (1, 0, 1), (1, 1, 0), (2, 0, 0)]
>>> get_tuple(4, 12)
[(0, 0, 0, 12), (0, 0, 1, 11), (0, 0, 2, 10), (0, 0, 3, 9), (0, 0, 4, 8), (0, 0, 5, 7), (0, 0, 6, 6), (0, 0, 7, 5), (0, 0, 8, 4), (0, 0, 9, 3), (0, 0, 10, 2), (0, 0, 11, 1), (0, 0, 12, 0), (0, 1, 0, 11), (0, 1, 1, 10), (0, 1, 2, 9), (0, 1, 3, 8), (0, 1, 4, 7), (0, 1, 5, 6), (0, 1, 6, 5), (0, 1, 7, 4), (0, 1, 8, 3), (0, 1, 9, 2), (0, 1, 10, 1), (0, 1, 11, 0), (0, 2, 0, 10), (0, 2, 1, 9), (0, 2, 2, 8), (0, 2, 3, 7), (0, 2, 4, 6), (0, 2, 5, 5), (0, 2, 6, 4), (0, 2, 7, 3), (0, 2, 8, 2), (0, 2, 9, 1), (0, 2, 10, 0), (0, 3, 0, 9), (0, 3, 1, 8), (0, 3, 2, 7), (0, 3, 3, 6), (0, 3, 4, 5), (0, 3, 5, 4), (0, 3, 6, 3), (0, 3, 7, 2), (0, 3, 8, 1), (0, 3, 9, 0), (0, 4, 0, 8), (0, 4, 1, 7), (0, 4, 2, 6), (0, 4, 3, 5), (0, 4, 4, 4), (0, 4, 5, 3), (0, 4, 6, 2), (0, 4, 7, 1), (0, 4, 8, 0), (0, 5, 0, 7), (0, 5, 1, 6), (0, 5, 2, 5), (0, 5, 3, 4), (0, 5, 4, 3), (0, 5, 5, 2), (0, 5, 6, 1), (0, 5, 7, 0), (0, 6, 0, 6), (0, 6, 1, 5), (0, 6, 2, 4), (0, 6, 3, 3), (0, 6, 4, 2), (0, 6, 5, 1), (0, 6, 6, 0), (0, 7, 0, 5), (0, 7, 1, 4), (0, 7, 2, 3), (0, 7, 3, 2), (0, 7, 4, 1), (0, 7, 5, 0), (0, 8, 0, 4), (0, 8, 1, 3), (0, 8, 2, 2), (0, 8, 3, 1), (0, 8, 4, 0), (0, 9, 0, 3), (0, 9, 1, 2), (0, 9, 2, 1), (0, 9, 3, 0), (0, 10, 0, 2), (0, 10, 1, 1), (0, 10, 2, 0), (0, 11, 0, 1), (0, 11, 1, 0), (0, 12, 0, 0), (1, 0, 0, 11), (1, 0, 1, 10), (1, 0, 2, 9), (1, 0, 3, 8), (1, 0, 4, 7), (1, 0, 5, 6), (1, 0, 6, 5), (1, 0, 7, 4), (1, 0, 8, 3), (1, 0, 9, 2), (1, 0, 10, 1), (1, 0, 11, 0), (1, 1, 0, 10), (1, 1, 1, 9), (1, 1, 2, 8), (1, 1, 3, 7), (1, 1, 4, 6), (1, 1, 5, 5), (1, 1, 6, 4), (1, 1, 7, 3), (1, 1, 8, 2), (1, 1, 9, 1), (1, 1, 10, 0), (1, 2, 0, 9), (1, 2, 1, 8), (1, 2, 2, 7), (1, 2, 3, 6), (1, 2, 4, 5), (1, 2, 5, 4), (1, 2, 6, 3), (1, 2, 7, 2), (1, 2, 8, 1), (1, 2, 9, 0), (1, 3, 0, 8), (1, 3, 1, 7), (1, 3, 2, 6), (1, 3, 3, 5), (1, 3, 4, 4), (1, 3, 5, 3), (1, 3, 6, 2), (1, 3, 7, 1), (1, 3, 8, 0), (1, 4, 0, 7), (1, 4, 1, 6), (1, 4, 2, 5), (1, 4, 3, 4), (1, 4, 4, 3), (1, 4, 5, 2), (1, 4, 6, 1), (1, 4, 7, 0), (1, 5, 0, 6), (1, 5, 1, 5), (1, 5, 2, 4), (1, 5, 3, 3), (1, 5, 4, 2), (1, 5, 5, 1), (1, 5, 6, 0), (1, 6, 0, 5), (1, 6, 1, 4), (1, 6, 2, 3), (1, 6, 3, 2), (1, 6, 4, 1), (1, 6, 5, 0), (1, 7, 0, 4), (1, 7, 1, 3), (1, 7, 2, 2), (1, 7, 3, 1), (1, 7, 4, 0), (1, 8, 0, 3), (1, 8, 1, 2), (1, 8, 2, 1), (1, 8, 3, 0), (1, 9, 0, 2), (1, 9, 1, 1), (1, 9, 2, 0), (1, 10, 0, 1), (1, 10, 1, 0), (1, 11, 0, 0), (2, 0, 0, 10), (2, 0, 1, 9), (2, 0, 2, 8), (2, 0, 3, 7), (2, 0, 4, 6), (2, 0, 5, 5), (2, 0, 6, 4), (2, 0, 7, 3), (2, 0, 8, 2), (2, 0, 9, 1), (2, 0, 10, 0), (2, 1, 0, 9), (2, 1, 1, 8), (2, 1, 2, 7), (2, 1, 3, 6), (2, 1, 4, 5), (2, 1, 5, 4), (2, 1, 6, 3), (2, 1, 7, 2), (2, 1, 8, 1), (2, 1, 9, 0), (2, 2, 0, 8), (2, 2, 1, 7), (2, 2, 2, 6), (2, 2, 3, 5), (2, 2, 4, 4), (2, 2, 5, 3), (2, 2, 6, 2), (2, 2, 7, 1), (2, 2, 8, 0), (2, 3, 0, 7), (2, 3, 1, 6), (2, 3, 2, 5), (2, 3, 3, 4), (2, 3, 4, 3), (2, 3, 5, 2), (2, 3, 6, 1), (2, 3, 7, 0), (2, 4, 0, 6), (2, 4, 1, 5), (2, 4, 2, 4), (2, 4, 3, 3), (2, 4, 4, 2), (2, 4, 5, 1), (2, 4, 6, 0), (2, 5, 0, 5), (2, 5, 1, 4), (2, 5, 2, 3), (2, 5, 3, 2), (2, 5, 4, 1), (2, 5, 5, 0), (2, 6, 0, 4), (2, 6, 1, 3), (2, 6, 2, 2), (2, 6, 3, 1), (2, 6, 4, 0), (2, 7, 0, 3), (2, 7, 1, 2), (2, 7, 2, 1), (2, 7, 3, 0), (2, 8, 0, 2), (2, 8, 1, 1), (2, 8, 2, 0), (2, 9, 0, 1), (2, 9, 1, 0), (2, 10, 0, 0), (3, 0, 0, 9), (3, 0, 1, 8), (3, 0, 2, 7), (3, 0, 3, 6), (3, 0, 4, 5), (3, 0, 5, 4), (3, 0, 6, 3), (3, 0, 7, 2), (3, 0, 8, 1), (3, 0, 9, 0), (3, 1, 0, 8), (3, 1, 1, 7), (3, 1, 2, 6), (3, 1, 3, 5), (3, 1, 4, 4), (3, 1, 5, 3), (3, 1, 6, 2), (3, 1, 7, 1), (3, 1, 8, 0), (3, 2, 0, 7), (3, 2, 1, 6), (3, 2, 2, 5), (3, 2, 3, 4), (3, 2, 4, 3), (3, 2, 5, 2), (3, 2, 6, 1), (3, 2, 7, 0), (3, 3, 0, 6), (3, 3, 1, 5), (3, 3, 2, 4), (3, 3, 3, 3), (3, 3, 4, 2), (3, 3, 5, 1), (3, 3, 6, 0), (3, 4, 0, 5), (3, 4, 1, 4), (3, 4, 2, 3), (3, 4, 3, 2), (3, 4, 4, 1), (3, 4, 5, 0), (3, 5, 0, 4), (3, 5, 1, 3), (3, 5, 2, 2), (3, 5, 3, 1), (3, 5, 4, 0), (3, 6, 0, 3), (3, 6, 1, 2), (3, 6, 2, 1), (3, 6, 3, 0), (3, 7, 0, 2), (3, 7, 1, 1), (3, 7, 2, 0), (3, 8, 0, 1), (3, 8, 1, 0), (3, 9, 0, 0), (4, 0, 0, 8), (4, 0, 1, 7), (4, 0, 2, 6), (4, 0, 3, 5), (4, 0, 4, 4), (4, 0, 5, 3), (4, 0, 6, 2), (4, 0, 7, 1), (4, 0, 8, 0), (4, 1, 0, 7), (4, 1, 1, 6), (4, 1, 2, 5), (4, 1, 3, 4), (4, 1, 4, 3), (4, 1, 5, 2), (4, 1, 6, 1), (4, 1, 7, 0), (4, 2, 0, 6), (4, 2, 1, 5), (4, 2, 2, 4), (4, 2, 3, 3), (4, 2, 4, 2), (4, 2, 5, 1), (4, 2, 6, 0), (4, 3, 0, 5), (4, 3, 1, 4), (4, 3, 2, 3), (4, 3, 3, 2), (4, 3, 4, 1), (4, 3, 5, 0), (4, 4, 0, 4), (4, 4, 1, 3), (4, 4, 2, 2), (4, 4, 3, 1), (4, 4, 4, 0), (4, 5, 0, 3), (4, 5, 1, 2), (4, 5, 2, 1), (4, 5, 3, 0), (4, 6, 0, 2), (4, 6, 1, 1), (4, 6, 2, 0), (4, 7, 0, 1), (4, 7, 1, 0), (4, 8, 0, 0), (5, 0, 0, 7), (5, 0, 1, 6), (5, 0, 2, 5), (5, 0, 3, 4), (5, 0, 4, 3), (5, 0, 5, 2), (5, 0, 6, 1), (5, 0, 7, 0), (5, 1, 0, 6), (5, 1, 1, 5), (5, 1, 2, 4), (5, 1, 3, 3), (5, 1, 4, 2), (5, 1, 5, 1), (5, 1, 6, 0), (5, 2, 0, 5), (5, 2, 1, 4), (5, 2, 2, 3), (5, 2, 3, 2), (5, 2, 4, 1), (5, 2, 5, 0), (5, 3, 0, 4), (5, 3, 1, 3), (5, 3, 2, 2), (5, 3, 3, 1), (5, 3, 4, 0), (5, 4, 0, 3), (5, 4, 1, 2), (5, 4, 2, 1), (5, 4, 3, 0), (5, 5, 0, 2), (5, 5, 1, 1), (5, 5, 2, 0), (5, 6, 0, 1), (5, 6, 1, 0), (5, 7, 0, 0), (6, 0, 0, 6), (6, 0, 1, 5), (6, 0, 2, 4), (6, 0, 3, 3), (6, 0, 4, 2), (6, 0, 5, 1), (6, 0, 6, 0), (6, 1, 0, 5), (6, 1, 1, 4), (6, 1, 2, 3), (6, 1, 3, 2), (6, 1, 4, 1), (6, 1, 5, 0), (6, 2, 0, 4), (6, 2, 1, 3), (6, 2, 2, 2), (6, 2, 3, 1), (6, 2, 4, 0), (6, 3, 0, 3), (6, 3, 1, 2), (6, 3, 2, 1), (6, 3, 3, 0), (6, 4, 0, 2), (6, 4, 1, 1), (6, 4, 2, 0), (6, 5, 0, 1), (6, 5, 1, 0), (6, 6, 0, 0), (7, 0, 0, 5), (7, 0, 1, 4), (7, 0, 2, 3), (7, 0, 3, 2), (7, 0, 4, 1), (7, 0, 5, 0), (7, 1, 0, 4), (7, 1, 1, 3), (7, 1, 2, 2), (7, 1, 3, 1), (7, 1, 4, 0), (7, 2, 0, 3), (7, 2, 1, 2), (7, 2, 2, 1), (7, 2, 3, 0), (7, 3, 0, 2), (7, 3, 1, 1), (7, 3, 2, 0), (7, 4, 0, 1), (7, 4, 1, 0), (7, 5, 0, 0), (8, 0, 0, 4), (8, 0, 1, 3), (8, 0, 2, 2), (8, 0, 3, 1), (8, 0, 4, 0), (8, 1, 0, 3), (8, 1, 1, 2), (8, 1, 2, 1), (8, 1, 3, 0), (8, 2, 0, 2), (8, 2, 1, 1), (8, 2, 2, 0), (8, 3, 0, 1), (8, 3, 1, 0), (8, 4, 0, 0), (9, 0, 0, 3), (9, 0, 1, 2), (9, 0, 2, 1), (9, 0, 3, 0), (9, 1, 0, 2), (9, 1, 1, 1), (9, 1, 2, 0), (9, 2, 0, 1), (9, 2, 1, 0), (9, 3, 0, 0), (10, 0, 0, 2), (10, 0, 1, 1), (10, 0, 2, 0), (10, 1, 0, 1), (10, 1, 1, 0), (10, 2, 0, 0), (11, 0, 0, 1), (11, 0, 1, 0), (11, 1, 0, 0), (12, 0, 0, 0)]
>>> 

暫無
暫無

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

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