如何生成带有某些下标的符号集

时间:2019-05-06 09:50:59

标签: python python-3.x sympy

我想通过以下方式定义一组符号: 我有三个不同的下标:[1,3,5] 必须生成以下符号: a_11,a_13,a_15,a_31,a_33,a_35,a_51,a_53,a_55

我如何有效地做到这一点?因此,无需单独定义所有符号。

4 个答案:

答案 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)