如何多次获得 strings/words 与每个单词的所有可能组合

how to get all possible combinations of strings/words with each word multiple times

我正在尝试创建所有可能的化合物化学计量学,本质上是结合 strings/words: 假设我有一个元素列表:

els=['Ba','Ti','O']

我说每个元素的数量最多可以是 3,我想要所有可能的组合,每个元素总是至少一次。所需的输出将是: ['BaTiO','BaTiO2','BaTiO3','BaTi2O','BaTi2O2','BaTi2O3'.....]

并且输入列表应该是任意长度的,例如如果是 els=['Ba','Sr','Ti','O'] 我想要的结果是: ['BaSrTiO','BaSrTiO2'....] (输出也可以是 [BaTiO,BaTiOO,BaTiOOO...] 的形式而不是数字) 我尝试使用 itertools 想出一些办法,但找不到方法。

有什么建议吗?

最终解决方案实际上非常简单,只需使用 itertools 中的 "product" 和 "pymatgen" 库。

phase_space=['Ba','Ti','O']
maxi=5

list1=[]

for ii in range(len(phase_space)):
    list1.append(list(range(1,1+maxi)))

new_list=list(product(*list1))

formulas=dict()
formula_list=[]
for ii in range(len(phase_space)):
    formulas[phase_space[ii]]=1
for ii in range(len(new_list)):
    for jj in range(len(phase_space)):
        formulas[phase_space[jj]]=new_list[ii][jj]
    comp = mg.Composition.from_dict(formulas)
    if len(list(comp.as_dict().values()))>=2:
        formula_list.append(comp.alphabetical_formula)


print(formula_list)  

然后输出如愿:

['Ba1 O1 Ti1', 'Ba1 O2 Ti1', 'Ba1 O3 Ti1', 'Ba1 O4 Ti1', 'Ba1 O5 Ti1', 'Ba1 O1 Ti2', 'Ba1 O2 Ti2', 'Ba1 O3 Ti2', 'Ba1 O4 Ti2', 'Ba1 O5 Ti2', 'Ba1 O1 Ti3', 'Ba1 O2 Ti3', 'Ba1 O3 Ti3', 'Ba1 O4 Ti3', 'Ba1 O5 Ti3', 'Ba1 O1 Ti4', 'Ba1 O2 Ti4', 'Ba1 O3 Ti4', 'Ba1 O4 Ti4', 'Ba1 O5 Ti4', 'Ba1 O1 Ti5', 'Ba1 O2 Ti5', 'Ba1 O3 Ti5', 'Ba1 O4 Ti5', 'Ba1 O5 Ti5', 'Ba2 O1 Ti1', 'Ba2 O2 Ti1', 'Ba2 O3 Ti1', 'Ba2 O4 Ti1', 'Ba2 O5 Ti1', 'Ba2 O1 Ti2', 'Ba2 O2 Ti2', 'Ba2 O3 Ti2', 'Ba2 O4 Ti2', 'Ba2 O5 Ti2', 'Ba2 O1 Ti3', 'Ba2 O2 Ti3', 'Ba2 O3 Ti3', 'Ba2 O4 Ti3', 'Ba2 O5 Ti3', 'Ba2 O1 Ti4', 'Ba2 O2 Ti4', 'Ba2 O3 Ti4', 'Ba2 O4 Ti4', 'Ba2 O5 Ti4', 'Ba2 O1 Ti5', 'Ba2 O2 Ti5', 'Ba2 O3 Ti5', 'Ba2 O4 Ti5', 'Ba2 O5 Ti5', 'Ba3 O1 Ti1', 'Ba3 O2 Ti1', 'Ba3 O3 Ti1', 'Ba3 O4 Ti1', 'Ba3 O5 Ti1', 'Ba3 O1 Ti2', 'Ba3 O2 Ti2', 'Ba3 O3 Ti2', 'Ba3 O4 Ti2', 'Ba3 O5 Ti2', 'Ba3 O1 Ti3', 'Ba3 O2 Ti3', 'Ba3 O3 Ti3', 'Ba3 O4 Ti3', 'Ba3 O5 Ti3', 'Ba3 O1 Ti4', 'Ba3 O2 Ti4', 'Ba3 O3 Ti4', 'Ba3 O4 Ti4', 'Ba3 O5 Ti4', 'Ba3 O1 Ti5', 'Ba3 O2 Ti5', 'Ba3 O3 Ti5', 'Ba3 O4 Ti5', 'Ba3 O5 Ti5', 'Ba4 O1 Ti1', 'Ba4 O2 Ti1', 'Ba4 O3 Ti1', 'Ba4 O4 Ti1', 'Ba4 O5 Ti1', 'Ba4 O1 Ti2', 'Ba4 O2 Ti2', 'Ba4 O3 Ti2', 'Ba4 O4 Ti2', 'Ba4 O5 Ti2', 'Ba4 O1 Ti3', 'Ba4 O2 Ti3', 'Ba4 O3 Ti3', 'Ba4 O4 Ti3', 'Ba4 O5 Ti3', 'Ba4 O1 Ti4', 'Ba4 O2 Ti4', 'Ba4 O3 Ti4', 'Ba4 O4 Ti4', 'Ba4 O5 Ti4', 'Ba4 O1 Ti5', 'Ba4 O2 Ti5', 'Ba4 O3 Ti5', 'Ba4 O4 Ti5', 'Ba4 O5 Ti5', 'Ba5 O1 Ti1', 'Ba5 O2 Ti1', 'Ba5 O3 Ti1', 'Ba5 O4 Ti1', 'Ba5 O5 Ti1', 'Ba5 O1 Ti2', 'Ba5 O2 Ti2', 'Ba5 O3 Ti2', 'Ba5 O4 Ti2', 'Ba5 O5 Ti2', 'Ba5 O1 Ti3', 'Ba5 O2 Ti3', 'Ba5 O3 Ti3', 'Ba5 O4 Ti3', 'Ba5 O5 Ti3', 'Ba5 O1 Ti4', 'Ba5 O2 Ti4', 'Ba5 O3 Ti4', 'Ba5 O4 Ti4', 'Ba5 O5 Ti4', 'Ba5 O1 Ti5', 'Ba5 O2 Ti5', 'Ba5 O3 Ti5', 'Ba5 O4 Ti5', 'Ba5 O5 Ti5']

您可以使用 itertools.permutations 来获得更短且更易读的解决方案:

from itertools import permutations

elements = {"Ba", "Ti", "O"}  # Set of elements
maxi = 3                      # Maximum occurrence

raw_output = permutations(range(1, maxi + 1), len(elements))
for i in raw_output:
    str_output = " ".join([f"{e}{v}" for e, v in zip(elements, i)])
    print(str_output)

>>> O1 Ba2 Ti3
    O1 Ba3 Ti2
    O2 Ba1 Ti3
    O2 Ba3 Ti1
    O3 Ba1 Ti2
    O3 Ba2 Ti1