我想構建一個函式GridGen
,以便它執行以下操作。
GridGen([a], -1, 1) --> [{a: -1}, {a: 0}, {a: -1}]
GridGen([a, b], -1, 1) --> [{a: -1, b: -1},{a: 0, b: -1}, {a: 1, b: -1},
{a: -1, b: 0}, {a: 0, b: 0}, {a: 1, b: 0},
{a: -1, b: 1}, {a: 0, b: 1}, {a: 1, b: 1}]
GridGen([a,b,c], -1, 1) --> [{a: -1, b: -1, c: -1},{a: 0, b: -1, c: -1}, {a: 1, b: -1, c:-1}, ... ]
目前,我通過兩個簡單的遞回函式實作了這一點。
from sage.all import *
def TensorMergeDict(dicts):
if len(dicts) == 2:
return flatten([[dicts[0][i] | dicts[1][j] for i in range(len(dicts[0]))] for j in range(len(dicts[1]))])
else:
print(TensorMergeDict([dicts[0], TensorMergeDict(dicts[1:])]))
return
def GridGen(vars, minV, maxV, step = 1):
dicts = [[{e: i} for i in range(minV, maxV 1, step)] for e in vars]
return TensorMergeDict(dicts)
where提供了扁平化串列sage
的便捷功能。flatten
我想知道是否有更好/有效的方法來做到這一點?感覺應該有一些現有的功能,Python
或者SageMath
促進這種操作。
uj5u.com熱心網友回復:
怎么樣itertools.product
?-
from itertools import product
def grid(keys, lo, hi):
for p in product(range(lo, hi 1), repeat=len(keys)):
yield {k:v for k,v in zip(keys, p)}
for x in grid("abc", -1, 1):
print(x)
{'a': -1, 'b': -1, 'c': -1}
{'a': -1, 'b': -1, 'c': 0}
{'a': -1, 'b': -1, 'c': 1}
{'a': -1, 'b': 0, 'c': -1}
{'a': -1, 'b': 0, 'c': 0}
{'a': -1, 'b': 0, 'c': 1}
{'a': -1, 'b': 1, 'c': -1}
{'a': -1, 'b': 1, 'c': 0}
{'a': -1, 'b': 1, 'c': 1}
{'a': 0, 'b': -1, 'c': -1}
{'a': 0, 'b': -1, 'c': 0}
{'a': 0, 'b': -1, 'c': 1}
{'a': 0, 'b': 0, 'c': -1}
{'a': 0, 'b': 0, 'c': 0}
{'a': 0, 'b': 0, 'c': 1}
{'a': 0, 'b': 1, 'c': -1}
{'a': 0, 'b': 1, 'c': 0}
{'a': 0, 'b': 1, 'c': 1}
{'a': 1, 'b': -1, 'c': -1}
{'a': 1, 'b': -1, 'c': 0}
{'a': 1, 'b': -1, 'c': 1}
{'a': 1, 'b': 0, 'c': -1}
{'a': 1, 'b': 0, 'c': 0}
{'a': 1, 'b': 0, 'c': 1}
{'a': 1, 'b': 1, 'c': -1}
{'a': 1, 'b': 1, 'c': 0}
{'a': 1, 'b': 1, 'c': 1}
keys
可以是字串或陣列 -
for x in grid(["foo", "bar"], -1, 1):
print(x)
{'foo': -1, 'bar': -1}
{'foo': -1, 'bar': 0}
{'foo': -1, 'bar': 1}
{'foo': 0, 'bar': -1}
{'foo': 0, 'bar': 0}
{'foo': 0, 'bar': 1}
{'foo': 1, 'bar': -1}
{'foo': 1, 'bar': 0}
{'foo': 1, 'bar': 1}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507829.html
下一篇:python中的遞回排列