@@ -57,7 +57,7 @@ def clean(self, s):
5757
5858 @property
5959 def characters (self ):
60- return self .data .keys ()
60+ return list ( self .data .keys () )
6161
6262 @property
6363 def ntrees (self ):
@@ -77,26 +77,23 @@ def symbols(self):
7777 symbols = [s for s in symbols if s not in ('-' , '?' )]
7878 return symbols
7979
80- def _make_charlabel_block (self ):
80+ def _iter_charlabels (self ):
8181 """Generates a character label block"""
82- out = [ "CHARSTATELABELS" ]
82+ yield "CHARSTATELABELS"
8383 for i , char in enumerate (sorted (self .characters ), 1 ):
84- out .append ("\t \t %d %s," % (i , self .clean (str (char ))))
85- out [- 1 ] = out [- 1 ].strip (',' ) # remove trailing comma
86- out .append (";" )
87- return "\n " .join (out )
84+ yield "\t \t %d %s%s" % (
85+ i , self .clean (str (char )), '' if i == len (self .characters ) else ',' )
86+ yield ";"
8887
89- def _make_matrix_block (self , interleave ):
88+ def _iter_matrix (self , interleave ):
9089 """Generates a matrix block"""
9190 max_taxon_size = max ([len (t ) for t in self .taxa ]) + 3
9291
93- out = []
9492 if interleave :
9593 for c in sorted (self .characters ):
9694 for t in self .taxa :
97- out .append ("%s %s" % (
98- t .ljust (max_taxon_size ), self .data [c ].get (t , self .MISSING )))
99- out .append ("" )
95+ yield "%s %s" % (t .ljust (max_taxon_size ), self .data [c ].get (t , self .MISSING ))
96+ yield ""
10097 else :
10198 for t in sorted (self .taxa ):
10299 s = []
@@ -105,8 +102,7 @@ def _make_matrix_block(self, interleave):
105102 if len (value ) > 1 : # wrap equivocal states in ()'s
106103 value = "(%s)" % value
107104 s .append (value )
108- out .append ("%s %s" % (t .ljust (max_taxon_size ), '' .join (s )))
109- return "\n " .join (out )
105+ yield "%s %s" % (t .ljust (max_taxon_size ), '' .join (s ))
110106
111107 def make_treeblock (self ):
112108 return "\n " .join ([" %s" % t .lstrip ().strip () for t in self .trees ])
@@ -148,9 +144,7 @@ def write(self, interleave=False, charblock=False, **kw):
148144 (basically a wrapper around make_nexus)
149145
150146 :param interleave: Generate interleaved matrix or not
151- :type interleave: Boolean
152147 :param charblock: Include a characters block or not
153- :type charblock: Boolean
154148
155149 :return: String
156150 """
@@ -182,8 +176,8 @@ def make_nexus(self, interleave=False, charblock=False):
182176 datablock = DATA_TEMPLATE % {
183177 'ntax' : len (self .taxa ),
184178 'nchar' : len (self .characters ),
185- 'charblock' : self ._make_charlabel_block ( ) if charblock else '' ,
186- 'matrix' : self ._make_matrix_block (interleave = interleave ),
179+ 'charblock' : ' \n ' . join ( self ._iter_charlabels () ) if charblock else '' ,
180+ 'matrix' : ' \n ' . join ( self ._iter_matrix (interleave = interleave ) ),
187181 'interleave' : 'INTERLEAVE' if interleave else '' ,
188182 'comments' : self ._make_comments (),
189183 'symbols' : '' .join (sorted (self .symbols )),
0 commit comments