我想通过以下方式定义一组符号: 我有三个不同的下标:[1,3,5] 必须生成以下符号: a_11,a_13,a_15,a_31,a_33,a_35,a_51,a_53,a_55
我如何有效地做到这一点?因此,无需单独定义所有符号。
答案 0 :(得分:2)
from sympy import Symbol
from itertools import combinations_with_replacement
symbol_indices = set([])
for a,b in combinations_with_replacement([1,3,5],2):
symbol_indices.add( (a,b) )
symbol_indices.add( (b,a))
[Symbol(f'a_{a}{b}' ) for a,b in symbol_indices]
答案 1 :(得分:1)
您应该尝试
from itertools import product
l1 = [1, 3, 5]
result = [f"a_{tuple_[0]}{tuple_[1]}" for tuple_ in product(map(str, l1), repeat=2)]
输出
['a_11', 'a_13', 'a_15', 'a_31', 'a_33', 'a_35', 'a_51', 'a_53', 'a_55']
对我来说
答案 2 :(得分:1)
如果您不想导入除“ sympy”之外的其他内容,则可以使用嵌套列表推导。
ind = (1, 3, 5)
sympy.symbols(['a_{}{}'.format(n, m) for n in ind for m in ind])
我认为itertools
只是在算法后面隐藏了真正的逻辑。我个人更喜欢编写代码,而不是使用带有不可读参数的大量嵌套函数。
答案 3 :(得分:0)
没有任何库,用于循环:
l= [1,3,5]
print (list("a_{}{}".format(*x) for x in list((x,y) for x in l for y in l)))
输出:
['a_11', 'a_13', 'a_15', 'a_31', 'a_33', 'a_35', 'a_51', 'a_53', 'a_55']
使用itertools:
from itertools import product
l= [1,3,5]
print (list("a_{}{}".format(*x) for x in list(product(l,repeat = 2))))
输出:
['a_11', 'a_13', 'a_15', 'a_31', 'a_33', 'a_35', 'a_51', 'a_53', 'a_55']
注意:
list((x,y) for x in l for y in l)
# equivalent to:
list(product(l,repeat = 2))
itertools.product()
此工具计算输入可迭代项的笛卡尔积。它是 等效于嵌套的for循环。例如,产品(A,B)返回 与((A中x对应B中y对应)( y)。