Come per Dovrei fare la mia domanda su quale struttura dati usare qui? Sto chiedendo questo qui. Spero che questo non sia troppo specifico per l'implementazione.
Attualmente sto sviluppando un programma che rappresenterà le strutture chimiche (e alla fine consentirà manipolazioni / reazioni di esse). Ho nascosto due diversi sistemi di archiviazione di questi dati, ma non sono sicuro di come scegliere quale.
Opzione 1: matrici annidate
I prodotti chimici hanno (più o meno) strutture definite e posizioni relative degli oggetti, e sembra che sarebbe più semplice rappresentare qualcosa di simile con una matrice - quindi posso assegnare "coordinate" definite ad ogni atomo o legame. Sfortunatamente, si finisce per sovrapporsi se si dispone di una struttura che si dirama in modo equo. Per risolvere questo problema ho risolto una soluzione che utilizzava matrici nidificate 5x5.
[[None, None, [CH3], None, None ],
[None, None, Bond, None, None ],
[[CH3], Bond, C, Bond, [CH3]],
[None, None, Bond, None, None ],
[None, None, [CH3], None, None ]]
Qui C
rappresenta l'elemento carbonio (questo potrebbe essere rappresentato in un paio di modi diversi, e qui non è particolarmente rilevante). Bond
rappresenta un legame e [CH3]
rappresenta un'altra matrice 5x5. Questo è il più alto ( [0][2]
) CH3
[[None, None, H, None, None],
[None, None, Bond, None, None],
[H, Bond, C, Bond, H ],
[None, None, Bond, None, None],
[None, None, Root, None, None]]
Qui il più basso Bond
è un riferimento allo stesso oggetto del più alto Bond
nella prima struttura, mentre Root
è (un po 'indeterminato) il modo di mettere in relazione che questo è dove la matrice si connette al livello successivo su. Se questa fosse una struttura più complessa, uno dei H
s sarebbe sostituito da un'altra matrice, ad esempio un [CH3]
aggiuntivo.
Vantaggi di questo metodo:
- Tutto è esplicitamente definito, inclusa la struttura, che è buona secondo Lo Zen di Python .
- Quando queste sostanze chimiche sono (eventualmente) rappresentate graficamente, sarà (teoricamente) molto più facile assicurarsi che ogni cosa sia al suo posto
Svantaggi:
- Questo non è affatto leggibile se hai una struttura più complessa
- Questo è annidato, non piatto
- Questo richiederà molte ricorsioni per passare attraverso
Opzione 2: dizionari
Un altro modo in cui potrei rappresentarli con una nidificazione significativamente inferiore e una migliore leggibilità sarebbero i dizionari. Ogni molecola sarebbe una chiave in un dizionario {Molecule1 : Data, Molecule2 : Data}
e i dati sarebbero anche dizionari Atoms: Data, Bonds: Data
. Ciò richiede un po 'meno di nidificazione, ma richiederebbe un po' più di lavoro quando alla fine voglio mostrarli.
Pensieri di chiusura
Prima di fare questa domanda, e in effetti mentre lo scrivevo, sono stato piuttosto impostato sui dizionari. Sembra un metodo più semplice e pulito per archiviare questi dati, e non richiederà di capire una tecnica ricorsiva davvero sgradevole per camminare attraverso una molecola. Tuttavia non sarei sorpreso se mi fossi perso qualcosa ed è per questo che sto chiedendo qui.
Se questo sembra troppo specifico per l'implementazione per favore fammi sapere cosa pensi che dovrei cambiare e farò del mio meglio per renderlo più generale