<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div style="" class="markdown-here-wrapper"
      data-md-url="Thunderbird">
      <p style="margin: 0px 0px 1.2em ! important;">Ciao lista,</p>
      <p style="margin: 0px 0px 1.2em ! important;">mi trovo a dover
        lavorare con dei file .xyz che sono dei file di testo del genere</p>
      <pre style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block ! important;">
C         -3.95384       -0.70179        0.00000
C         -3.93661       -2.09651        0.00000
C         -2.72014       -2.77895       -0.00000
C         -1.52089       -2.06666        0.00000
C         -1.53812       -0.67195        0.00000
C         -2.75460        0.01049       -0.00000
H         -4.90162       -0.17009       -0.00000
H         -4.87097       -2.65146        0.00000
H         -2.70671       -3.86559        0.00000
H         -0.57311       -2.59836        0.00000
H         -0.60377       -0.11700       -0.00000
H         -2.76802        1.09714       -0.00000
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">ovvero ogni riga
        contiene un atomo con informazione sull’elemento atomico e le
        coordinate. Io ho creato una semplice namedtuple per contenere
        le informazioni sull’atomo</p>
      <pre style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block ! important;">
class Atom(namedtuple('Atom', ['element', 'coords'])):

    pass

atoms = [Atom('C', numpy.array([-3.95384, -0.70179, 0.00000])), ... ]
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">Facendo il parsing
        del file di testo posso dunque generare una lista che contiene
        istanze di Atom. Con una lista posso facilmente iterare su
        quello che chiamerò l’indice “globale”. Il problema su cui
        chiedo consigli è che contemporaneamente mi serve poter
        selezionare un atomo in base ad un indice “locale”, ovvero un
        indice che appartiene all’elemento chimico. In questo caso,
        dovrei poter iterare sul carbonio 6 volte (indice da 0 a 5) e
        sull’idrogeno pure.</p>
      <p style="margin: 0px 0px 1.2em ! important;">Per esempio, vorrei
        poter fare qualcosa tipo <code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">atoms.byElementIndex('H', 0)</code>
        per selezionare il primo idrogeno.</p>
      <p style="margin: 0px 0px 1.2em ! important;">Che vi pare se
        faccio una cosa del genere</p>
      <pre style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block ! important;">
class Atoms(list):
    def __init__(self):
        super(Atoms, self).__init__()
        self._atoms_by_elem = {}

    def append(self, atom):
        super(Atoms, self).append(atom)
        if atom.element not in self._atoms_by_elem.keys():
            self._atoms_by_elem[atom.element] = []
        self._atoms_by_elem[atom.element].append(self.index(atom))

    def byElementIndex(self, element, index):
        global_index = self._atoms_by_elem[element][index]
        return self[global_index]

atoms = Atoms()
atoms.append(Atom('C', [0, 0, 0]))
atoms.append(Atom('C', [0, 0, 1]))
atoms.append(Atom('H', [1, 1, 1]))
atoms.append(Atom('C', [0, 1, 1]))
atoms.append(Atom('H', [2, 1, 1]))
</code></pre>
      <pre style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block ! important;">
>>> atoms.byElementIndex('H', 0)
Atom(element='H', coords=[1, 1, 1])
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">Ovviamente ora come
        ora il dizionario e la lista non rimangono sincronizzati se
        rimuovo elementi da <code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">atoms</code>
        ma per ora non mi interessa.</p>
      <p style="margin: 0px 0px 1.2em ! important;">Ogni consiglio è ben
        accetto.</p>
      <p style="margin: 0px 0px 1.2em ! important;">Ciao,</p>
      <p style="margin: 0px 0px 1.2em ! important;">Davide</p>
      <div
title="MDH:PHA+Q2lhbyBsaXN0YSw8L3A+PHA+bWkgdHJvdm8gYSBkb3ZlciBsYXZvcmFyZSBjb24gZGVpIGZpbGUgLnh5eiBjaGUgc29ubyBkZWkgZmlsZSBkaSB0ZXN0byBkZWwgZ2VuZXJlPC9wPjxwPmBgYDwv
cD48cD5DJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC0z
Ljk1Mzg0Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC0wLjcwMTc5Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDAuMDAwMDA8YnI+QyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAtMy45MzY2MSZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAtMi4wOTY1MSZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAwLjAwMDAwPGJyPkMmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLTIuNzIwMTQmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsgLTIuNzc4OTUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsgLTAuMDAwMDA8YnI+QyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyAtMS41MjA4OSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAtMi4w
NjY2NiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAwLjAwMDAwPGJy
PkMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLTEuNTM4
MTImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLTAuNjcxOTUmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMC4wMDAwMDxicj5DJm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC0yLjc1NDYwJm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDAuMDEwNDkmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsgLTAuMDAwMDA8YnI+SCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAtNC45MDE2MiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyAtMC4xNzAwOSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAt
MC4wMDAwMDxicj5IJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7IC00Ljg3MDk3Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC0yLjY1MTQ2
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDAuMDAwMDA8YnI+SCZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAtMi43MDY3MSZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAtMy44NjU1OSZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAwLjAwMDAwPGJyPkgmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLTAuNTczMTEmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsgLTIuNTk4MzYmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsgMC4wMDAwMDxicj5IJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7IC0wLjYwMzc3Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7IC0wLjExNzAwJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC0wLjAw
MDAwPGJyPkgmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsg
LTIuNzY4MDImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMS4wOTcx
NCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAtMC4wMDAwMDwvcD48cD5gYGA8
L3A+PHA+b3Z2ZXJvIG9nbmkgcmlnYSBjb250aWVuZSB1biBhdG9tbyBjb24gaW5mb3JtYXppb25l
IHN1bGwnZWxlbWVudG8gYXRvbWljbyBlIGxlIGNvb3JkaW5hdGUuIElvIGhvIGNyZWF0byB1bmEg
c2VtcGxpY2UgbmFtZWR0dXBsZSBwZXIgY29udGVuZXJlIGxlIGluZm9ybWF6aW9uaSBzdWxsJ2F0
b21vPC9wPjxwPjxicj48L3A+PHA+YGBgPGZvbnQgY29sb3I9IiMzMzAwMzMiPjxicj48L2ZvbnQ+
PC9wPjxwPjxmb250IGNvbG9yPSIjMzMwMDMzIj5jbGFzcyBBdG9tKG5hbWVkdHVwbGUoJ0F0b20n
LCBbJ2VsZW1lbnQnLCAnY29vcmRzJ10pKTo8L2ZvbnQ+PGJyPjwvcD48Zm9udCBjb2xvcj0iIzMz
MDAzMyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBhc3M8YnI+PGJyPmF0b21zID0gW0F0b20oJ0MnLCBu
dW1weS5hcnJheShbPC9mb250Pjxmb250IGNvbG9yPSIjMzMwMDMzIj4tMy45NTM4NCwgPC9mb250
Pjxmb250IGNvbG9yPSIjMzMwMDMzIj4tMC43MDE3OSwgPC9mb250Pjxmb250IGNvbG9yPSIjMzMw
MDMzIj4wLjAwMDAwXSkpLCAuLi4gXTxicj48L2ZvbnQ+PHA+YGBgPC9wPjxwPjxicj48L3A+PHA+
RmFjZW5kbyBpbCBwYXJzaW5nIGRlbCBmaWxlIGRpIHRlc3RvIHBvc3NvIGR1bnF1ZSBnZW5lcmFy
ZSB1bmEgbGlzdGEgY2hlIGNvbnRpZW5lIGlzdGFuemUgZGkgQXRvbS4gQ29uIHVuYSBsaXN0YSBw
b3NzbyBmYWNpbG1lbnRlIGl0ZXJhcmUgc3UgcXVlbGxvIGNoZSBjaGlhbWVyw7IgbCdpbmRpY2Ug
Imdsb2JhbGUiLiBJbCBwcm9ibGVtYSBzdSBjdWkgY2hpZWRvIGNvbnNpZ2xpIMOoIGNoZSBjb250
ZW1wb3JhbmVhbWVudGUgbWkgc2VydmUgcG90ZXIgc2VsZXppb25hcmUgdW4gYXRvbW8gaW4gYmFz
ZSBhZCB1biBpbmRpY2UgImxvY2FsZSIsIG92dmVybyB1biBpbmRpY2UgY2hlIGFwcGFydGllbmUg
YWxsJ2VsZW1lbnRvIGNoaW1pY28uIEluIHF1ZXN0byBjYXNvLCBkb3ZyZWkgcG90ZXIgaXRlcmFy
ZSBzdWwgY2FyYm9uaW8gNiB2b2x0ZSAoaW5kaWNlIGRhIDAgYSA1KSBlIHN1bGwnaWRyb2dlbm8g
cHVyZS48L3A+PHA+PGJyPjwvcD48cD5QZXIgZXNlbXBpbywgdm9ycmVpIHBvdGVyIGZhcmUgcXVh
bGNvc2EgdGlwbyBgYXRvbXMuYnlFbGVtZW50SW5kZXgoJ0gnLCAwKWAgcGVyIHNlbGV6aW9uYXJl
IGlsIHByaW1vIGlkcm9nZW5vLjwvcD48cD48YnI+PC9wPkNoZSB2aSBwYXJlIHNlIGZhY2NpbyB1
bmEgY29zYSBkZWwgZ2VuZXJlPHA+PGJyPjwvcD48cD5gYGA8L3A+PHA+PG1ldGEgaHR0cC1lcXVp
dj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPmNsYXNz
IEF0b21zKGxpc3QpOjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgZGVmIF9faW5pdF9fKHNlbGYpOjxi
cj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc3VwZXIoQXRvbXMs
IHNlbGYpLl9faW5pdF9fKCk8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7IHNlbGYuX2F0b21zX2J5X2VsZW0gPSB7fTxicj48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7
IGRlZiBhcHBlbmQoc2VsZiwgYXRvbSk6PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyBzdXBlcihBdG9tcywgc2VsZikuYXBwZW5kKGF0b20pPGJyPiZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZiBhdG9tLmVsZW1lbnQgbm90IGlu
IHNlbGYuX2F0b21zX2J5X2VsZW0ua2V5cygpOjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc2VsZi5fYXRvbXNfYnlf
ZWxlbVthdG9tLmVsZW1lbnRdID0gW108YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7IHNlbGYuX2F0b21zX2J5X2VsZW1bYXRvbS5lbGVtZW50XS5hcHBlbmQoc2Vs
Zi5pbmRleChhdG9tKSk8YnI+PGJyPjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgZGVmIGJ5RWxlbWVu
dEluZGV4KHNlbGYsIGVsZW1lbnQsIGluZGV4KTo8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7IGdsb2JhbF9pbmRleCA9IHNlbGYuX2F0b21zX2J5X2VsZW1bZWxl
bWVudF1baW5kZXhdPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyByZXR1cm4gc2VsZltnbG9iYWxfaW5kZXhdPC9wPjxwPjxicj48L3A+PHA+YXRvbXMgPSBBdG9t
cygpPGJyPmF0b21zLmFwcGVuZChBdG9tKCdDJywgWzAsIDAsIDBdKSk8YnI+YXRvbXMuYXBwZW5k
KEF0b20oJ0MnLCBbMCwgMCwgMV0pKTxicj5hdG9tcy5hcHBlbmQoQXRvbSgnSCcsIFsxLCAxLCAx
XSkpPGJyPmF0b21zLmFwcGVuZChBdG9tKCdDJywgWzAsIDEsIDFdKSk8YnI+YXRvbXMuYXBwZW5k
KEF0b20oJ0gnLCBbMiwgMSwgMV0pKTxicj48L3A+PHA+YGBgPC9wPjxwPmBgYDxicj48L3A+PHA+
Jmd0OyZndDsmZ3Q7IGF0b21zLmJ5RWxlbWVudEluZGV4KCdIJywgMCk8YnI+QXRvbShlbGVtZW50
PSdIJywgY29vcmRzPVsxLCAxLCAxXSk8YnI+YGBgPGJyPjwvcD48cD5PdnZpYW1lbnRlIG9yYSBj
b21lIG9yYSBpbCBkaXppb25hcmlvIGUgbGEgbGlzdGEgbm9uIHJpbWFuZ29ubyBzaW5jcm9uaXp6
YXRpIHNlIHJpbXVvdm8gZWxlbWVudGkgZGEgYGF0b21zYCBtYSBwZXIgb3JhIG5vbiBtaSBpbnRl
cmVzc2EuPC9wPjxwPjxicj48L3A+PHA+T2duaSBjb25zaWdsaW8gw6ggYmVuIGFjY2V0dG8uPC9w
PjxwPjxicj48L3A+PHA+Q2lhbyw8L3A+PHA+PGJyPjwvcD48cD5EYXZpZGU8YnI+PC9wPjxwPiZu
        YnNwOyZuYnNwOyZuYnNwOyA8YnI+PC9wPjxwPjxicj48L3A+"
style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </body>
</html>