Создайте все комбинации из 4 элементов из большого списка - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу создать все возможные комбинации из 4 химических элементов из списка из 9 и использовать их для создания папок, названных в честь этих комбинаций.Желаемый список выглядит примерно так:

{Cr, Hf, Mo, Nb, Ta, Ti, V, W, Zr}

То, что я хочу из него получить, будет:

CrHfMoNb

CrHfMoTa

CrHfMoTi

CrHfMoV

...

TiVWZr

и так далее для всех 126 возможных аранжировок, сохраненных в списке или чем-то подобном, чтобы я мог использовать его в качестве входных данных для создания папок.Эти комбинации должны быть упорядочены в алфавитном порядке, так что Hf всегда следует после Cr и перед Ti, например.Я могу использовать как Bash, так и Python, я предпочитаю более простой метод.Если метод можно легко адаптировать к другому числу, например, комбинациям из 5, это большой плюс.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Не такой короткий, как метод python, но все же простой.Создайте массив оболочки и циклически проработайте его в четырех циклах for, получая желаемые 126 строк:

ELARR=(Cr Hf Mo Nb Ta Ti V W Zr)
for ((i=0; i<${#ELARR[@]}; i++))
    do  for ((j=i+1; j<${#ELARR[@]}; j++))
          do    for ((k=j+1; k<${#ELARR[@]}; k++))
                  do    for ((l=k+1; l<${#ELARR[@]}; l++))
                          do    echo ${ELARR[i]}${ELARR[j]}${ELARR[k]}${ELARR[l]}
                          done
                  done
          done
    done
CrHfMoNb
CrHfMoTa
CrHfMoTi
CrHfMoV
CrHfMoW
.
.
.
TaTiWZr
TaVWZr
TiVWZr

Будет еще короче, если вы присвоите число элементов массива переменной, и будете использовать его, а также mayhapиспользовать более короткое имя массива ...

0 голосов
/ 23 ноября 2018

Python имеет «itertools», который включает в себя функцию для выполнения таких комбинаций для вас.

combinations('ABCD', 2)  returns    AB AC AD BC BD CD

, чтобы вы могли сделать что-то вроде ...

#!/usr/bin/python3.5
import itertools
output = []
for i in itertools.combinations(['Cr', 'Hf', 'Mo', 'Nb', 'Ta', 'Ti', 'V', 'W', 'Zr'], 4):
        output.append("".join(i))
print(sorted(output))

, которое произведет все 126 комбинаций и отсортирует их для вас.

['CrHfMoNb', 'CrHfMoTa', 'CrHfMoTi', 'CrHfMoV', 'CrHfMoW', 'CrHfMoZr', 'CrHfNbTa', 'CrHfNbTi', 'CrHfNbV', 'CrHfNbW', 'CrHfNbZr', 'CrHfTaTi', 'CrHfTaV', 'CrHfTaW', 'CrHfTaZr', 'CrHfTiV', 'CrHfTiW', 'CrHfTiZr', 'CrHfVW', 'CrHfVZr', 'CrHfWZr', 'CrMoNbTa', 'CrMoNbTi', 'CrMoNbV', 'CrMoNbW', 'CrMoNbZr', 'CrMoTaTi', 'CrMoTaV', 'CrMoTaW', 'CrMoTaZr', 'CrMoTiV', 'CrMoTiW', 'CrMoTiZr', 'CrMoVW', 'CrMoVZr', 'CrMoWZr', 'CrNbTaTi', 'CrNbTaV', 'CrNbTaW', 'CrNbTaZr', 'CrNbTiV', 'CrNbTiW', 'CrNbTiZr', 'CrNbVW', 'CrNbVZr', 'CrNbWZr', 'CrTaTiV', 'CrTaTiW', 'CrTaTiZr', 'CrTaVW', 'CrTaVZr', 'CrTaWZr', 'CrTiVW', 'CrTiVZr', 'CrTiWZr', 'CrVWZr', 'HfMoNbTa', 'HfMoNbTi', 'HfMoNbV', 'HfMoNbW', 'HfMoNbZr', 'HfMoTaTi', 'HfMoTaV', 'HfMoTaW', 'HfMoTaZr', 'HfMoTiV', 'HfMoTiW', 'HfMoTiZr', 'HfMoVW', 'HfMoVZr', 'HfMoWZr', 'HfNbTaTi', 'HfNbTaV', 'HfNbTaW', 'HfNbTaZr', 'HfNbTiV', 'HfNbTiW', 'HfNbTiZr', 'HfNbVW', 'HfNbVZr', 'HfNbWZr', 'HfTaTiV', 'HfTaTiW', 'HfTaTiZr', 'HfTaVW', 'HfTaVZr', 'HfTaWZr', 'HfTiVW', 'HfTiVZr', 'HfTiWZr', 'HfVWZr', 'MoNbTaTi', 'MoNbTaV', 'MoNbTaW', 'MoNbTaZr', 'MoNbTiV', 'MoNbTiW', 'MoNbTiZr', 'MoNbVW', 'MoNbVZr', 'MoNbWZr', 'MoTaTiV', 'MoTaTiW', 'MoTaTiZr', 'MoTaVW', 'MoTaVZr', 'MoTaWZr', 'MoTiVW', 'MoTiVZr', 'MoTiWZr', 'MoVWZr', 'NbTaTiV', 'NbTaTiW', 'NbTaTiZr', 'NbTaVW', 'NbTaVZr', 'NbTaWZr', 'NbTiVW', 'NbTiVZr', 'NbTiWZr', 'NbVWZr', 'TaTiVW', 'TaTiVZr', 'TaTiWZr', 'TaVWZr', 'TiVWZr']

Если выхотят их "аккуратно" просто использовать ...

#!/usr/bin/python3.5
import itertools
output = []
for i in itertools.combinations(['Cr', 'Hf', 'Mo', 'Nb', 'Ta', 'Ti', 'V', 'W', 'Zr'], 4):
        output.append("".join(i))

while output:
        print(output.pop(0))

, который дает ...

CrHfMoNb CrHfMoTa CrHfMoTi CrHfMoV CrHfMoW CrHfMoZr CrHfNbTa CrHfNbTi CrHfNbV CrHfNbW CrHfNbZr CrHfTaTi CrHfTaV CrHfTaW CrHfTaZr CrHfTiV CrHfTiWCrHfTiZr CrHfVW CrHfVZr CrHfWZr CrMoNbTa CrMoNbTi CrMoNbV CrMoNbW CrMoNbZr CrMoTaTi CrMoTaV CrMoTaW CrMoTaZr CrMoTiV CrMoTiW CrMoTiZr CrMoVW CrMoVZr CrMoWZr CrNbTaTi CrNbTaV CrNbTaW CrNbTaZr CrNbTiV CrNbTiW CrNbTiZr CrNbVW CrNbVZr CrNbWZr CrTaTiV CrTaTiW CrTaTiZr CrTaVW CrTaVZr CrTaWZr CrTiVW CrTiVZr CrTiWZr CrVWZr HfMoNbTa HfMoNbTi HfMoNbV HfMoNbW HfMoNbZr HfMoTaTi HfMoTaV HfMoTaW HfMoTaZr HfMoTiV HfMoTiWHfMoTiZr HfMoVW HfMoVZr HfMoWZr HfNbTaTi HfNbTaV HfNbTaW HfNbTaZr HfNbTiV HfNbTiW HfNbTiZr HfNbVW HfNbVZr HfNbWZr HfTaTiV HfTaTiW HfTaTiZr HfTaVW HfTaVZr HfTaWZr HfTiVW HfTiVZr HfTiWZr HfVWZr MoNbTaTi MoNbTaV MoNbTaW MoNbTaZr MoNbTiV MoNbTiW MoNbTiZr MoNbVW MoNbVZr MoNbWZr MoTaTiV MoTaTiW MoTaTiZr MoTaVW MoTaVZr MoTaWZr MoTiVW MoTiVZr MoTiWZr MoVWZr NbTaTiV NbTaTiW NbTaTiZr NbTaVW NbTaVZr NbTaWZr NbTiVW NbTiVZr NbTiWZr NbVWZr TaTiVW TaTiVZr TaTiWZr TaVWZr TiVWZr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...