簡體   English   中英

Python:生成范圍內值的所有n長度數組合

[英]Python: Generating all n-length arrays combinations of values within a range

好。 我正在尋找最聰明,更緊湊的方法來完成這項功能

def f():
    [[a,b,c] for a in range(6) for b in range(6) for c in range(6)]

這應該生成值a,b,c的所有組合,如下所示:

[0,0,0]
[0,0,1]
[0,0,2]
...
[1,0,0]
[1,0,1]
...

等等...

但我希望這是靈活的,所以我可以改變范圍或可迭代,以及生成的數組的長度。 范圍很簡單:

def f(min, max):
    [[a,b,c] for a in range(min,max) for b in range(min,max) for c in range(min,max)]

對於3長度數組,這是可以的,但我現在考慮制作4長度數組或7長度數組,並在相同范圍內為它們生成所有組合。

它必須以一種簡單的方式存在,可能以某種方式連接數組或嵌套理解列表,但我的解決方案似乎過於復雜。

對不起這么長的帖子。

您可以使用itertools.product

from itertools import product

def f(mn, mx, n):
    return list(product(*[range(mn, mx)]*n)))

刪除list ,返回生成器以提高內存效率。

您可以使用itertools.product ,它只是嵌套迭代的便利函數。 如果你想多次重復相同的iterable它也有一個repeat參數:

>>> from itertools import product

>>> amin = 0
>>> amax = 2
>>> list(product(range(amin, amax), repeat=3))
[(0, 0, 0), (0, 0, 1), (0, 1, 0),  (0, 1, 1),  (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

要獲取listlist ,你可以使用map

>>> list(map(list, product(range(amin, amax), repeat=3)))
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]

但是product是一個迭代器,所以如果你只是迭代它而不是將它強制轉換為list ,它真的很有效。 至少如果你的程序可以做到這一點。 例如:

>>> for prod in product(range(amin, amax), repeat=3):
...     print(prod)  # one example
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)

itertools擁有您需要的一切。 combination_with_replacement將生成給定長度的組合,其中包含來自給定iterable的重復元素。 請注意,返回的值將是迭代器。

def f(min, max, num):    
    return itertools.combinations_with_replacement(range(min, max), num)

純python實現:

k=2  # k-uples
xmin=2
xmax=5 
n=xmax-xmin

l1 = [x for x in range(n**k)]
l2 = [[ x//n**(k-j-1)%n for x in l1] for j in range(k)]          
l3 = [[ xmin + l2[i][j] for i in range(k)] for j in range(n**k)]

l3是:

[[2 2]
 [2 3]
 [2 4]
 [3 2]
 [3 3]
 [3 4]
 [4 2]
 [4 3]
 [4 4]]

您正在尋找的是范圍的笛卡爾積。 幸運的是,這已經存在於itertools中

import itertools
print(list(itertools.product(range(0,5), range(0,5), range(0,5))))

暫無
暫無

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

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