<div dir="ltr">Hi Michael, <div><br></div><div>My apologies -- both for taking so long to get back to you and for having sent you down the wrong track here. </div><div><br></div><div>The idea of using **kwargs in the snippet I sent was to get around specifying all the arguments to the initializing function Nexus.Nexus. Any argument in the keyword list needs to be specified by name so here you would have had to use OrderNexus(input=&quot;FILENAME&quot;). (In fact, input is the _only_ non-self argument to the Nexus initializer, so it would have been easier just to name it, sorry).</div><div><br></div><div>As it happens that wouldn&#39;t have got you much further, because the combine function overwrites the character partitions anyway. </div><div><br></div><div>Instead, here&#39;s a hacky solution that seems to work. Do all the combining as per usual then overwrite the partition dictionary with an OrderedDict sorted to match your input order:</div><div><br></div><div><div><br></div><div>files = [&quot;zero.nex&quot;, &quot;one.nex&quot;]</div><div>n = Nexus.Nexus(&quot;codonposset.nex&quot;) #biopython/Tests/Nexus/</div><div>combined = Nexus.combine([(&quot;zero.nex&quot;, n), (&quot;one.nex&quot;, n)])</div><div>combined.charpartitions[&quot;combined&quot;].keys()</div></div><div># Not the order we want them!</div><div><div># [&#39;one.nex&#39;, &#39;zero.nex&#39;]</div></div><div><br></div><div>#Create an dictionay to map filename to desired order</div><div>order_map = {pos:fname for fname, pos in enumerate(files)}<br></div><div>#re-place the &#39;inner&#39; dictionary with and ordered one, suing the map as the sorting key</div><div><div>combined.charpartitions[&quot;combined&quot;] = OrderedDict(</div><div>          sorted(combined.charpartitions[&quot;combined&quot;].items(), </div><div>           key=lambda x: order_map[ x[0] ]))</div><div><br></div></div><div><div>combined.charpartitions[&quot;combined&quot;].keys()</div><div>#This is the order we wanted</div><div># [&#39;zero.nex&#39;, &#39;one.nex&#39;]</div><div><br></div></div><div>Hope that helps, </div><div><br></div><div>David</div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 10, 2015 at 6:14 AM, Michael Gruenstaeudl <span dir="ltr">&lt;<a href="mailto:mi.gruenstaeudl@gmail.com" target="_blank">mi.gruenstaeudl@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi David,<br>
thank you for your response. However, I am not fully certain that I understand your suggested way forward. Is the below example what you meant (and if so, how would you debug it)?<br>
Thank you, Michael<br>
<br>
<br>
&gt;&gt;&gt; from Bio.Nexus import Nexus<br>
&gt;&gt;&gt; import glob<br>
&gt;&gt;&gt; file_list = glob.glob(&#39;*.nex&#39;)<br>
&gt;&gt;&gt; file_list.sort() # Important step<br>
&gt;&gt;&gt; nexi = [(fname, Nexus.Nexus(fname)) for fname in file_list]<br>
&gt;&gt;&gt; from collections import OrderedDict<br>
&gt;&gt;&gt; class OrderedNexus(Nexus.Nexus):<br>
...   def __init__(self, **kwargs):<br>
...     Nexus.Nexus.__init__(self, **kwargs)<br>
...     self.charpartitions = OrderedDict()<br>
...<br>
&gt;&gt;&gt; nexi_ordered = [(n[0], OrderedNexus(n[1])) for n in nexi]<br>
Traceback (most recent call last):<br>
  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;<br>
TypeError: __init__() takes exactly 1 argument (2 given)<br>
&gt;&gt;&gt; # Would be followed by: combined = Nexus.combine(nexi_ordered)<br>
<br>
<br>
<br>
Michael Grünstäudl (Gruenstaeudl), PhD<span class=""><br>
E-mail: <a href="mailto:mi.gruenstaeudl@gmail.com" target="_blank">mi.gruenstaeudl@gmail.com</a><br>
Website: <a href="http://blogs.fu-berlin.de/gruenstaeudl/" rel="noreferrer" target="_blank">http://blogs.fu-berlin.de/gruenstaeudl/</a><br>
<br>
<br></span><span class="">
On 06/09/2015 11:19 PM, David Winter wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
In that last message the class definition should be<br>
<br>
class OrderedNexus(Nexus.Nexus):<br>
     &quot;&quot;&quot; Subclass of Bio.Nexus.Nexus used to maintain partition order &quot;&quot;&quot;<br>
<br>
     def __init__(self, **kwargs):<br>
         Nexus.Nexus.__init__(self, **kwargs)<br>
         self.charpartitions = OrderedDict()<br>
<br>
(i.e. with the parentheses after OrderedDict..... you always see them<br>
the second you hit &quot;send&quot; :)<br>
<br>
David<br>
<br>
On Tue, Jun 9, 2015 at 2:17 PM, David Winter &lt;<a href="mailto:djwinter@asu.edu" target="_blank">djwinter@asu.edu</a><br></span><div><div class="h5">
&lt;mailto:<a href="mailto:djwinter@asu.edu" target="_blank">djwinter@asu.edu</a>&gt;&gt; wrote:<br>
<br>
    Hi Michael,<br>
<br>
    I think this is a result of  &quot;charpartitions&quot; in the Nexus object<br>
    being a dictionary. In python dictionaries are &quot;unordered&quot;, so you<br>
    don&#39;t usually get objects back out in the order they went in.<br>
<br>
    One possible workaround it to make you own class that inherits<br>
    everything else from Nexus but instead uses an ordered  dictionary<br>
    (from collections), something like<br>
<br>
<br>
    from collections import OrderedDict<br>
    from Bio.Nexus import Nexus<br>
<br>
    class OrderedNexus(Nexus.Nexus):<br>
         &quot;&quot;&quot; Subclass of Bio.Nexus.Nexus used to maintain partition<br>
    order &quot;&quot;&quot;<br>
<br>
         def __init__(self, **kwargs):<br>
             Nexus.Nexus.__init__(self, **kwargs)<br>
             self.charpartitions = OrderedDict<br>
<br>
<br>
<br>
    o = OrderedNexus()<br>
    n = Nexus.Nexus()<br>
      o.charpartitions<br>
    #OrderedDict()<br>
    n.charpartitions<br>
    #{}<br>
    dir(o) # (all the stuff you expect to see in a Nexus object)<br>
<br>
    I haven&#39;t had a chance to test this on the example, but hope it&#39;s<br>
    some help to you.<br>
<br>
    David<br>
<br>
<br>
    On Tue, Jun 9, 2015 at 6:37 AM, Michael Gruenstaeudl<br></div></div><span class="">
    &lt;<a href="mailto:mi.gruenstaeudl@gmail.com" target="_blank">mi.gruenstaeudl@gmail.com</a> &lt;mailto:<a href="mailto:mi.gruenstaeudl@gmail.com" target="_blank">mi.gruenstaeudl@gmail.com</a>&gt;&gt; wrote:<br>
<br>
        Hi all,<br>
        like many others, I have been using the excellent example on the<br>
        Biopython wiki to concatenate multiple alignments into one<br>
        nexus-file using Biopython&#39;s Nexus.combine() function. However,<br>
        what if I wish to maintain the order of the nexus-partitions<br>
        specified in &#39;file_list&#39;. While the tuple &#39;nexi&#39; is still<br>
        ordered according to &#39;file_list&#39;, &#39;combined.charsets.items()&#39; is<br>
        not. Moreover, sorting the charsets is not possible:<br>
<br>
         &gt;&gt;&gt; combined.charsets.items()[0]<br>
        (&#39;partition0038_rps4_CDS.nex&#39;, [36567, 36568])<br>
<br>
         &gt;&gt;&gt; combined.charsets.items()[1]<br>
        (&#39;partition0004_trnK_CDS.nex&#39;, [36569, 36573])<br>
<br>
         &gt;&gt;&gt; for i in range(0,len(combined.charsets.items())):<br>
        ...     combined.charsets.items()[i] = sorted_items[i]<br>
        ...<br>
         &gt;&gt;&gt; combined.charsets.items()[0]<br>
        (&#39;partition0038_rps4_CDS.nex&#39;, [36567, 36568])<br>
<br>
        What procedure would you recommend to maintain the input order<br>
        of &#39;file_list&#39; in the output file &#39;combined.nex&#39;?<br>
<br>
        Thank you, Michael<br>
<br>
        --<br>
        Michael Gruenstaeudl (Grünstäudl), PhD<br></span>
        E-mail: <a href="mailto:mi.gruenstaeudl@gmail.com" target="_blank">mi.gruenstaeudl@gmail.com</a> &lt;mailto:<a href="mailto:mi.gruenstaeudl@gmail.com" target="_blank">mi.gruenstaeudl@gmail.com</a>&gt;<br>
        Website: <a href="http://blogs.fu-berlin.de/gruenstaeudl/" rel="noreferrer" target="_blank">http://blogs.fu-berlin.de/gruenstaeudl/</a><br>
        &lt;<a href="http://u.osu.edu/gruenstaeudl/" rel="noreferrer" target="_blank">http://u.osu.edu/gruenstaeudl/</a>&gt;<span class=""><br>
<br>
        _______________________________________________<br>
        Biopython mailing list  - <a href="mailto:Biopython@mailman.open-bio.org" target="_blank">Biopython@mailman.open-bio.org</a><br></span>
        &lt;mailto:<a href="mailto:Biopython@mailman.open-bio.org" target="_blank">Biopython@mailman.open-bio.org</a>&gt;<span class=""><br>
        <a href="http://mailman.open-bio.org/mailman/listinfo/biopython" rel="noreferrer" target="_blank">http://mailman.open-bio.org/mailman/listinfo/biopython</a><br>
<br>
<br>
<br>
<br>
    --<br>
    David Winter<br>
    Postdoctoral Research Associate<br>
    Center for Evolutionary Medicine and Informatics<br>
    The Biodesign Institute<br>
    Arizona State University<br>
<br></span>
    ph: <a href="tel:%2B1%20480%20519%205113" value="+14805195113" target="_blank">+1 480 519 5113</a> &lt;tel:%2B1%20480%20519%205113&gt;<br>
    w: <a href="http://www.david-winter.info" rel="noreferrer" target="_blank">www.david-winter.info</a> &lt;<a href="http://www.david-winter.info" rel="noreferrer" target="_blank">http://www.david-winter.info</a>&gt;<br>
    lab: <a href="http://cartwrig.ht/lab/" rel="noreferrer" target="_blank">http://cartwrig.ht/lab/</a><br>
    blog: <a href="http://sciblogs.co.nz/the-atavism" rel="noreferrer" target="_blank">sciblogs.co.nz/the-atavism</a> &lt;<a href="http://sciblogs.co.nz/the-atavism" rel="noreferrer" target="_blank">http://sciblogs.co.nz/the-atavism</a>&gt;<span class=""><br>
<br>
<br>
<br>
<br>
--<br>
David Winter<br>
Postdoctoral Research Associate<br>
Center for Evolutionary Medicine and Informatics<br>
The Biodesign Institute<br>
Arizona State University<br>
<br>
ph: <a href="tel:%2B1%20480%20519%205113" value="+14805195113" target="_blank">+1 480 519 5113</a><br></span>
w: <a href="http://www.david-winter.info" rel="noreferrer" target="_blank">www.david-winter.info</a> &lt;<a href="http://www.david-winter.info" rel="noreferrer" target="_blank">http://www.david-winter.info</a>&gt;<br>
lab: <a href="http://cartwrig.ht/lab/" rel="noreferrer" target="_blank">http://cartwrig.ht/lab/</a><br>
blog: <a href="http://sciblogs.co.nz/the-atavism" rel="noreferrer" target="_blank">sciblogs.co.nz/the-atavism</a> &lt;<a href="http://sciblogs.co.nz/the-atavism" rel="noreferrer" target="_blank">http://sciblogs.co.nz/the-atavism</a>&gt;<br>
</blockquote>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div>David Winter</div><div>Postdoctoral Research Associate</div><div>Center for Evolutionary Medicine and Informatics</div><div>The Biodesign Institute</div><div>Arizona State University</div><div><br></div><div>ph: +1 480 519 5113</div><div>w: <a href="http://www.david-winter.info" target="_blank">www.david-winter.info</a></div><div>lab: <a href="http://cartwrig.ht/lab/" target="_blank">http://cartwrig.ht/lab/</a></div><div>blog: <a href="http://sciblogs.co.nz/the-atavism" target="_blank">sciblogs.co.nz/the-atavism</a></div></div></div>
</div>