我有一個元組串列,它們本質上是我的第 i 個值可以迭代的范圍。該串列如下所示:
L = [(10,20),(30,40),(60,70),(90,100)]
這些是這些范圍的上限和下限,將在生成包含邊界的所有值之前固定。
有人可以告訴我生成唯一組合的最佳方法是什么,其中串列的每個值都位于其元組邊界之間?14641 種組合。
Ex:
[15,30,65,90] is valid
[27,33,67,99] is not valid
我嘗試通過嵌套它們來使用 for 回圈,但遇到了運行時問題。
任何幫助表示贊賞。非常感謝。
uj5u.com熱心網友回復:
以下將使用itertools.product:
from itertools import product
combos = product(*(range(a, b 1) for a, b in L))
next(combos)
# (10, 30, 60, 90)
next(combos)
# (10, 30, 60, 91)
# ...
如果您在 a 中需要它們list,只需解壓迭代器:
combos = [*product(*(range(a, b 1) for a, b in L))]
uj5u.com熱心網友回復:
使用itertools.product和itertools.starmap在間隔上映射范圍。
from itertools import product, starmap
L = [(10, 20), (30, 40), (60, 70), (90, 100)]
Ls = [(lb, ub 1) for lb, ub in L]
for combination in product(*starmap(range, L)):
print(combination)
uj5u.com熱心網友回復:
你可以使用:
from itertools import product
L = [(10,20),(30,40),(60,70),(90,100)]
L2 = [list(range(a, b 1)) for a,b in L]
all_products = list(itertools.product(*L2))
獲取隨機值:
import random
random.sample(all_products, 10)
輸出:
[(12, 37, 61, 98),
(15, 35, 65, 90),
(13, 38, 61, 98),
(12, 37, 61, 92),
(19, 34, 63, 91),
(15, 37, 66, 91),
(13, 32, 66, 98),
(17, 31, 64, 97),
(10, 38, 63, 99),
(16, 34, 61, 90)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314374.html
上一篇:檢查元素是否已經在串列中
