正攻法, 変わり種など4つ。
方法3に問題が合ったので修正いたしました。
それと方法4を追加。
今回出力したいのはこのようなマトリクス
Ile Val Leu Phe Cys Met Ala Gly Thr Trp Ser Tyr Pro His Asp Glu Asn Gln Lys Arg
Ile IleIle IleVal IleLeu IlePhe IleCys IleMet IleAla IleGly IleThr IleTrp IleSer IleTyr IlePro IleHis IleAsp IleGlu IleAsn IleGln IleLys IleArg
Val ValIle ValVal ValLeu ValPhe ValCys ValMet ValAla ValGly ValThr ValTrp ValSer ValTyr ValPro ValHis ValAsp ValGlu ValAsn ValGln ValLys ValArg
Leu LeuIle LeuVal LeuLeu LeuPhe LeuCys LeuMet LeuAla LeuGly LeuThr LeuTrp LeuSer LeuTyr LeuPro LeuHis LeuAsp LeuGlu LeuAsn LeuGln LeuLys LeuArg
Phe PheIle PheVal PheLeu PhePhe PheCys PheMet PheAla PheGly PheThr PheTrp PheSer PheTyr PhePro PheHis PheAsp PheGlu PheAsn PheGln PheLys PheArg
Cys CysIle CysVal CysLeu CysPhe CysCys CysMet CysAla CysGly CysThr CysTrp CysSer CysTyr CysPro CysHis CysAsp CysGlu CysAsn CysGln CysLys CysArg
Met MetIle MetVal MetLeu MetPhe MetCys MetMet MetAla MetGly MetThr MetTrp MetSer MetTyr MetPro MetHis MetAsp MetGlu MetAsn MetGln MetLys MetArg
Ala AlaIle AlaVal AlaLeu AlaPhe AlaCys AlaMet AlaAla AlaGly AlaThr AlaTrp AlaSer AlaTyr AlaPro AlaHis AlaAsp AlaGlu AlaAsn AlaGln AlaLys AlaArg
Gly GlyIle GlyVal GlyLeu GlyPhe GlyCys GlyMet GlyAla GlyGly GlyThr GlyTrp GlySer GlyTyr GlyPro GlyHis GlyAsp GlyGlu GlyAsn GlyGln GlyLys GlyArg
Thr ThrIle ThrVal ThrLeu ThrPhe ThrCys ThrMet ThrAla ThrGly ThrThr ThrTrp ThrSer ThrTyr ThrPro ThrHis ThrAsp ThrGlu ThrAsn ThrGln ThrLys ThrArg
Trp TrpIle TrpVal TrpLeu TrpPhe TrpCys TrpMet TrpAla TrpGly TrpThr TrpTrp TrpSer TrpTyr TrpPro TrpHis TrpAsp TrpGlu TrpAsn TrpGln TrpLys TrpArg
Ser SerIle SerVal SerLeu SerPhe SerCys SerMet SerAla SerGly SerThr SerTrp SerSer SerTyr SerPro SerHis SerAsp SerGlu SerAsn SerGln SerLys SerArg
Tyr TyrIle TyrVal TyrLeu TyrPhe TyrCys TyrMet TyrAla TyrGly TyrThr TyrTrp TyrSer TyrTyr TyrPro TyrHis TyrAsp TyrGlu TyrAsn TyrGln TyrLys TyrArg
Pro ProIle ProVal ProLeu ProPhe ProCys ProMet ProAla ProGly ProThr ProTrp ProSer ProTyr ProPro ProHis ProAsp ProGlu ProAsn ProGln ProLys ProArg
His HisIle HisVal HisLeu HisPhe HisCys HisMet HisAla HisGly HisThr HisTrp HisSer HisTyr HisPro HisHis HisAsp HisGlu HisAsn HisGln HisLys HisArg
Asp AspIle AspVal AspLeu AspPhe AspCys AspMet AspAla AspGly AspThr AspTrp AspSer AspTyr AspPro AspHis AspAsp AspGlu AspAsn AspGln AspLys AspArg
Glu GluIle GluVal GluLeu GluPhe GluCys GluMet GluAla GluGly GluThr GluTrp GluSer GluTyr GluPro GluHis GluAsp GluGlu GluAsn GluGln GluLys GluArg
Asn AsnIle AsnVal AsnLeu AsnPhe AsnCys AsnMet AsnAla AsnGly AsnThr AsnTrp AsnSer AsnTyr AsnPro AsnHis AsnAsp AsnGlu AsnAsn AsnGln AsnLys AsnArg
Gln GlnIle GlnVal GlnLeu GlnPhe GlnCys GlnMet GlnAla GlnGly GlnThr GlnTrp GlnSer GlnTyr GlnPro GlnHis GlnAsp GlnGlu GlnAsn GlnGln GlnLys GlnArg
Lys LysIle LysVal LysLeu LysPhe LysCys LysMet LysAla LysGly LysThr LysTrp LysSer LysTyr LysPro LysHis LysAsp LysGlu LysAsn LysGln LysLys LysArg
Arg ArgIle ArgVal ArgLeu ArgPhe ArgCys ArgMet ArgAla ArgGly ArgThr ArgTrp ArgSer ArgTyr ArgPro ArgHis ArgAsp ArgGlu ArgAsn ArgGln ArgLys ArgArg
方法1: 大人しくnumpy使う
正攻法 (numpy入ってる人にとっては)。
import numpy as np
Aminos = ["Ile", "Val", "Leu", "Phe", "Cys", "Met", "Ala", "Gly", "Thr", "Trp", "Ser", "Tyr", "Pro", "His", "Asp", "Glu", "Asn", "Gln", "Lys", "Arg"]
data = [[a1+a2 for a2 in Aminos] for a1 in Aminos]
with open("matrix.txt", "w") as f:
f.write("\t" + "\t".join(Aminos) + "\n")
np.savetxt(f, np.hstack([zip(Aminos), data]), fmt='%s', delimiter="\t")
方法2: とりあえずprintしてawkに投げる
awkに馴染みがあれば、まぁ楽といえば楽か
Aminos = ["Ile", "Val", "Leu", "Phe", "Cys", "Met", "Ala", "Gly", "Thr", "Trp", "Ser", "Tyr", "Pro", "His", "Asp", "Glu", "Asn", "Gln", "Lys", "Arg"]
print
for a1 in Aminos:
print a1
for a1 in Aminos:
print a1
for a2 in Aminos:
print a1+a2
% python matrix_test.py | awk 'BEGIN{c=1}{if(c%21 == 0){print $0}else{printf $0"\t"};c++}' > matrix.txt
方法3: printによる出力
見た目上は出来てるが実際は出来てない方法、とその解決方法。
Aminos = ["Ile", "Val", "Leu", "Phe", "Cys", "Met", "Ala", "Gly", "Thr", "Trp", "Ser", "Tyr", "Pro", "His", "Asp", "Glu", "Asn", "Gln", "Lys", "Arg"]
print "\t",
for a1 in Aminos:
if Aminos[-1] == a1:
print "%s\n" % a1,
else:
print "%s\t" % a1,
for a1 in Aminos:
print "%s\t" % a1,
for a2 in Aminos:
if Aminos[-1] == a2:
print "%s\n" % (a1+a2),
else:
print "%s\t" % (a1+a2),
問題点1
なぜ問題かは次のようにすれば分かる
for i in range(10):
print "#",
% python print_test.py
# # # # # # # # # #
つまりprint,には改行コードの代わりに空白が入る。
これでは見かけは出来ていても再利用する際に空白とタブの混在でsplitが面倒になる。
これはPython3系であれば
for i in range(10):
print("#", end="")
Python2系の場合は
import sys
for i in range(10):
sys.stdout.write("#")
とすることで解消できる。
問題点2
今回の場合は出来ているが、listは重複を許すので
for a1 in Aminos:
if Aminos[-1] == a1:
print "%s\n" % a1,
else:
print "%s\t" % a1,
ではなく
for i in range(len(Aminos)):
if len(Aminos) == i+1:
print "%s\n" % Aminos[i],
else:
print "%s\t" % Aminos[i],
の方が確実かと。
方法4: 普通にwrite
Aminos = ["Ile", "Val", "Leu", "Phe", "Cys", "Met", "Ala", "Gly", "Thr", "Trp", "Ser", "Tyr", "Pro", "His", "Asp", "Glu", "Asn", "Gln", "Lys", "Arg"]
with open("matrix.txt", "w") as f:
f.write("\t")
for i in range(len(Aminos)):
if len(Aminos) == i+1:
f.write("%s\n" % Aminos[i])
else:
f.write("%s\t" % Aminos[i])
for j in range(len(Aminos)):
f.write("%s\t" % Aminos[j])
for i in range(len(Aminos)):
if len(Aminos) == i+1:
f.write("%s\n" % (Aminos[j]+Aminos[i]))
else:
f.write("%s\t" % (Aminos[j]+Aminos[i]))