从只有两个dict(a,c(,我需要找到term_wMca,它只给出:xA*xB*xc*W_ABC。事实上,我需要留下重复的,比如W_AAC、W_BBC,只有三元的,没有重复。当用户输入更大的dict时,应该在term_wMca中计算三元。有办法做到这一点吗??
import sympy as sp
a = {'A': 1}
c = {'B': 1, 'C': 1}
term_wMca = 0
for k in a:
for j in c:
for l in c:
term_wMca += sp.symbols(f'x{str(k)}') * sp.symbols(f'x{str(j)}') *
sp.symbols(f'x{str(l)}') *sp.symbols(f'W_{str(l)}{str(j)}{str(k)}')
print(term_wMca)
无需对每个变量使用for-loop
:
import sympy as sp
a = {'A': 1}
c = {'B': 1, 'C': 1}
keys = list(a.keys()) + list(c.keys())
term_wMca = 1
for k in keys:
term_wMca *= sp.symbols(f'x{k}')
term_wMca *= sp.symbols(f'W_' + ''.join(keys))
print(term_wMca)
结果:
W_ABC * xA * xB * xC
这里使用itertools.combination模块我们可以避免重复组合,因为下面的代码可以解决我的问题,可能对其他人有用。
import sympy as sp
import itertools
a = {'A': 1}
c = {'B': 1, 'C': 1}
term_wMca = 0
term = list(sp.symbols(f'x{x}') * sp.symbols(f'x{y}') *
sp.symbols(f'x{z}') *sp.symbols(f'W_{x}{y}{z}') for x, y in
itertools.combinations((c.keys()), 2) for z in (a.keys()))
for i in range(len(term)):
term_wMca += term[i]
print('w:', type(term_wMca), term_wMca)
它给出:
2W_BCAxAxBxC
此外,对于更大的c和a,它工作得很好:a={'a':1,'M':1、'N':1}c={‘B’:1,‘c’:1、‘D’:1}
W_BCAxAxBxC+W_BCMxCxM+W_BCNxBxCxN+W_BDAxAxBxD+W_BDMxDxM+T+W_BDNxBxDem>xD+W_CDMxCxDxM+W_CDNxCxD*xN