как получить все возможные комбинации строк / слов с каждым словом несколько раз - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь создать все возможные стехиометрии химических соединений, которые по существу объединяют строки / слова: допустим, у меня есть список элементов:

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

, и я говорю номер каждого элемента может быть максимально 3, и я хочу все возможные комбинации, причем каждый элемент должен быть хотя бы один раз. Желаемый результат будет: ['BaTiO','BaTiO2','BaTiO3','BaTi2O','BaTi2O2','BaTi2O3'.....]

И список ввода должен иметь произвольную длину, например, если он равен els=['Ba','Sr','Ti','O'], я хочу получить в результате: ['BaSrTiO','BaSrTiO2'....] (вывод также может иметь форму [BaTiO, BaTiOO, BaTiOOO…] вместо цифр) Я пытался что-то придумать, используя itertools, но не могу найти способ, как это сделать.

Есть предложения?

1 Ответ

0 голосов
/ 15 апреля 2020

В конце концов, решение было довольно простым, просто с использованием «product» от itertools и библиотеки «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']
...