@schokk64rus

Как сгенерировать все возможные комбинации из двух списков?

Добрый день!
Есть два списка:
atoms = ['Co1', 'Co2', 'Co3', 'Co4', 'Co5', 'Co6', 'Co7', 'Co8']
dopedatoms = ['Mn1', 'Mn2', 'Mn3', 'Mn4', 'Mn5', 'Mn6', 'Mn7', 'Mn8']

Нужно сгенерировать все возможные комбинации, взяв из первого списка 7 элементов, а из второго 1:
['Co8', 'Co2', 'Co3', 'Co4', 'Co5', 'Co6', 'Co7', 'Mn1']
['Co8', 'Co1', 'Co3', 'Co4', 'Co5', 'Co6', 'Co7', 'Mn2']
['Co8', 'Co1', 'Co2', 'Co4', 'Co5', 'Co6', 'Co7', 'Mn3']
['Co8, 'Co1', 'Co2', 'Co3', 'Co5', 'Co6', 'Co7', 'Mn4']
['Co8', 'Co1', 'Co2', 'Co3', 'Co4', 'Co6', 'Co7', 'Mn5']
['Co8', 'Co1', 'Co2', 'Co3', 'Co4', 'Co5', 'Co7', 'Mn6']
и т.д.

а затем взять из первого списка 6 элементов, а из второго 2:
['Co8', 'Co2', 'Co3', 'Co4', 'Co5', 'Co6', 'Mn7', 'Mn1']
['Co1', 'Co7', 'Co8', 'Co4', 'Co5', 'Co6', 'Mn3', 'Mn2']
...
 и т.д.

И так нужно сгенерировать все комбинации, уменьшая число элементов из первого списка и увеличивая из второго.

В комбинациях не должно быть повторений элементов с одинаковым номером (Co1 и Mn1 и т.д.):
['Co1, 'Co2', 'Co3', 'Co4', 'Co5', 'Co6', 'Mn1', 'Mn2']
['Co1', 'Co7', 'Co8', 'Co4', 'Co5', 'Co6', 'Mn7', 'Mn8']
...
 и т.д.


В дальнейшем вместо Co1, Co2... будут указаны координаты в формате xyz (Пример: 0.118167 0.376788 0.873409)

Пробовал так:
comb1 = itertools.combinations(atoms, 6)
comb2 = itertools.combinations(dopedatoms, 2)
result = itertools.product(comb1, comb2)
но это приводит к появлению повторяющихся элементов.
  • Вопрос задан
  • 791 просмотр
Решения вопроса 1
hint000
@hint000
у админа три руки
С уточнением про повторения цифр это эквивалентно перебору комбинаций
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 1
...
1 1 1 1 1 1 1 1
(всего 256 комбинаций),
где 0 означает, что берём элемент из atoms,
1 означает, что берём элемент из dopedatoms, например
1 0 0 0 0 0 0 0 соответствует ['Mn1', 'Co2', 'Co3', 'Co4', 'Co5', 'Co6', 'Co7', 'Co8']
Так что можете сделать цикл от 0 до 255, разбивать переменную цикла на биты и по битам формировать комбинации.
В условиях не упомянуты граничные случаи 0 0 0 0 0 0 0 0 и 1 1 1 1 1 1 1 1, если они не нужны, то цикл делать от 1 до 254.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы