我要创建9种化学元素中所有可能的4种化学元素的组合,并使用它们来创建以这些组合命名的文件夹。 所需的列表如下所示:
{Cr,Hf,Mo,Nb,Ta,Ti,V,W,Zr}
我想摆脱的是:
CrHfMoNb
CrHfMoTa
CrHfMoTi
CrHfMoV
...
TiVWZr
,对于所有126种可能的排列,依此类推,存储在列表或类似内容中,以便我可以将其用作创建文件夹的输入。这些组合应按字母顺序排列,以使Hf始终位于Cr之后和Ti之前。 我可以同时使用Bash和Python,我更喜欢简单的方法。如果该方法可以轻松地适应不同的数字(例如5的组合),那将是一个很大的优势。
答案 0 :(得分:2)
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 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
答案 1 :(得分:2)
不如python方法那么短,但仍然很简单。创建一个shell数组,并在四个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
如果将数组的元素计数分配给变量,然后使用它,甚至会更短。