在python中获取两个字典的非重复排列



只有两个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

最新更新