Periodisches System der Elemente - und mit Listen arbeiten!

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Basilius Sapientia
User
Beiträge: 46
Registriert: Freitag 5. September 2014, 22:34

Hallo ihr Lieben!

Ich habe grundlegende Verständnisprobleme mit Python. Ich werde versuchen, so viel beizusteuern wie ich kann, damit ihr mir helfen könnt. Doch leider bin ich nicht besonders gut und bin gerade am verzweifeln. Ich beherrsche etwas LaTeX, und wollte mein persönliches LaTeX Periodensystem der Elemente erstellen. Allerdings müsste ich (sehr oft) immer wieder das Gleiche schreiben. Ich dachte, dass ich nur sehr wenig Code in Python schreiben müsste, um das gewünschte Ergebnis zu halten. Hier ist, was ich gerne erhalten will:

Code: Alles auswählen

\node[name=H, Element] {\NaturalElementTextFormat{1}{1.0079}{H}{Hydrogen}};
Wie will ich das erhalten? Ich habe eine Liste mit vier Säulen. Die letzte (fünfte) Säule ist unwichtig, habe ich nur mit, weil ich die Liste kopiert habe und nicht weiß wie man eine Säule löscht.

Vorstellungen (konkret)
Die Liste enthält folgende wichtige Daten: AN, Symb, Name, AU.
Ich hätte gerne, dass man mit print eine Liste von allen 118 Elementen erstellen kann. Somit das Ergenis so aussieht:

Code: Alles auswählen

\node[name=Symb, Element] {\NaturalElementTextFormat{AN}{AU}{Symb}{Name}};
Natürlich sollte es nicht so ausgedruckt werden. AN, Symb, Name und AU sollte eigentlich mit den Daten ausgefüllt werden, die in der Liste ist. Also so zu sagen "print den Code mit den Daten statt den Platzhaltern für die erste Reihe" unten drunter "print den Code mit den Daten statt den Platzhaltern für die zweite Reihe" ... bis hin zur Reihe 118. Ich hoffe ihr versteht was ich meine? Damit wäre mir sehr viel Arbeit erspart!

Schwierigkeiten
Ich habe keine Ahnung wie man die Liste lädt, die erste Reihe ignoriert und jede Säule einen "Namen" gibt, also etwas damit man Reihe 1 sagen kann und der Computer versteht.
Ich habe keine Ahnung, wie man dann alles so "ausdruckt", wie ich es gerne hätte.
(Falls möglich: bei AU nur drei Zahlen nach dem Komma, indem auf- oder abgerundet wird).

Nutzen
Ich werde dadurch lernen Listen einzufügen und "Namen" zu geben. Außerdem werde ich lernen sie mit "print" zu nutzen. Außerdem kann ich dann einfach ein Perioden System der Elemente erstellen.


HOFFENTLICH HILFT MIR JEMAND! ICH STECKE ÄUßERST FEST! Was ich bisher erreicht habe (bin ein vollkommener Beginner, habe aber sehr viele Introduktionen gelesen)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
Die Liste:

Code: Alles auswählen

AN   	Symb 	Name		AU		Notes
1	H	Hydrogen	1.008	3, 6
2	He	Helium		4.002602(2)	1, 2
3	Li	Lithium		6.94	3, 6
4	Be	Beryllium	9.0121831(5)
5	B	Boron	10.81	3, 6
6	C	Carbon	12.011	6
7	N	Nitrogen	14.007	6
8	O	Oxygen	15.999	6
9	F	Fluorine	18.998403163(6)
10	Ne	Neon	20.1797(6)	1, 3
11	Na	Sodium	22.98976928(2)    
12	Mg	Magnesium	24.305	6
13	Al	Aluminium	26.9815385(7)
14	Si	Silicon	28.085	6
15	P	Phosphorus	30.973761998(5)
16	S	Sulfur	32.06	6
17	Cl	Chlorine	35.45	3, 6
18	Ar	Argon	39.948(1)	1, 2
19	K	Potassium	39.0983(1)	
20	Ca	Calcium	40.078(4)	
21	Sc	Scandium	44.955908(5)
22	Ti	Titanium	47.867(1)
23	V	Vanadium	50.9415(1)
24	Cr	Chromium	51.9961(6)
25	Mn	Manganese	54.938044(3)
26	Fe	Iron	55.845(2)
27	Co	Cobalt	58.933194(4)
28	Ni	Nickel	58.6934(4)	2
29	Cu	Copper	63.546(3)	2
30	Zn	Zinc	65.38(2)	2
31	Ga	Gallium	69.723(1)
32	Ge	Germanium	72.630(8)
33	As	Arsenic	74.921595(6)
34	Se	Selenium	78.971(8)
35	Br	Bromine	79.904	6
36	Kr	Krypton	83.798(2)	1, 3
37	Rb	Rubidium	85.4678(3)	1
38	Sr	Strontium	87.62(1)	1, 2
39	Y	Yttrium	88.90584(2)
40	Zr	Zirconium	91.224(2)	1
41	Nb	Niobium	92.90637(2)
42	Mo	Molybdenum	95.95(1)	1
43	Tc	Technetium	97	4
44	Ru	Ruthenium	101.07(2)	1
45	Rh	Rhodium	102.90550(2)
46	Pd	Palladium	106.42(1)	1
47	Ag	Silver	107.8682(2)	1
48	Cd	Cadmium	112.414(4)	1
49	In	Indium	114.818(1)
50	Sn	Tin	118.710(7)	1
51	Sb	Antimony	121.760(1)	1
52	Te	Tellurium	127.60(3)	1
53	I	Iodine	126.90447(3)
54	Xe	Xenon	131.293(6)	1, 3
55	Cs	Caesium	132.90545196(6)
56	Ba	Barium	137.327(7)
57	La	Lanthanum	138.90547(7)	1
58	Ce	Cerium	140.116(1)	1
59	Pr	Praseodymium    	140.90766(2)
60	Nd	Neodymium	144.242(3)	1
61	Pm	Promethium	145	5
62	Sm	Samarium	150.36(2)	1
63	Eu	Europium	151.964(1)	1
64	Gd	Gadolinium	157.25(3)	1
65	Tb	Terbium	158.92535(2)
66	Dy	Dysprosium	162.500(1)	1
67	Ho	Holmium	164.93033(2)
68	Er	Erbium	167.259(3)	1
69	Tm	Thulium	168.93422(2)
70	Yb	Ytterbium	173.054(5)	1
71	Lu	Lutetium	174.9668(1)	1
72	Hf	Hafnium	178.49(2)
73	Ta	Tantalum	180.94788(2)
74	W	Tungsten	183.84(1)
75	Re	Rhenium	186.207(1)
76	Os	Osmium	190.23(3)	1
77	Ir	Iridium	192.217(3)
78	Pt	Platinum	195.084(9)
79	Au	Gold	196.966569(5)
80	Hg	Mercury	200.592(3)
81	Tl	Thallium	204.38	6
82	Pb	Lead	207.2(1)	1, 2
83	Bi	Bismuth	208.98040(1)
84	Po	Polonium	209	4
85	At	Astatine	210	4
86	Rn	Radon	222	4
87	Fr	Francium	223	4
88	Ra	Radium	226	4
89	Ac	Actinium	227	4
90	Th	Thorium	232.0377(4)	1, 4
91	Pa	Protactinium	231.03588(2)	4
92	U	Uranium	238.02891(3)	1, 3, 4
93	Np	Neptunium	237	4
94	Pu	Plutonium	244	4
95	Am	Americium	243	4
96	Cm	Curium	247	4
97	Bk	Berkelium	247	4
98	Cf	Californium	251	4
99	Es	Einsteinium	252	4
100	Fm	Fermium	257	4
101	Md	Mendelevium	258	4
102	No	Nobelium	259	4
103	Lr	Lawrencium	262	4
104	Rf	Rutherfordium	267	4
105	Db	Dubnium	270	4
106	Sg	Seaborgium	271	4
107	Bh	Bohrium	270	4
108	Hs	Hassium	277	4
109	Mt	Meitnerium	276	4
110	Ds	Darmstadtium	281	4
111	Rg	Roentgenium	282	4
112	Cn	Copernicium	285	4
113	Uut	Ununtrium	285	4, 5
114	Fl	Flerovium	289	4, 5
115	Uup	Ununpentium	289	4, 5
116	Lv	Livermorium	293	4, 5
117	Uus	Ununseptium	294	4, 5
118	Uuo	Ununoctium	294	4, 5
Ein großes Dankeschön schon mal!
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Basilius Sapientia: warum machst Du es nicht einfach in LaTeX?

Code: Alles auswählen

\documentclass{article}
\usepackage{tikz}

\newcommand{\CommonElementTextFormat}[4]
{
  \begin{minipage}{2.2cm}
    \centering
      {\textbf{#1} \hfill #2}%
      \linebreak \linebreak
      {\textbf{#3}}%
      \linebreak \linebreak
      {{#4}}
  \end{minipage}
}

\newcommand{\NaturalElementTextFormat}[4]
{
  \CommonElementTextFormat{#1}{#2}{\LARGE {#3}}{#4}
}


\newread\linereader
\def\foreachline#1#2{\openin\linereader=#1\nextline#2}
\def\nextline#1{\read\linereader to \line\ifeof\linereader\closein\linereader\else\expandafter#1\line\end\expandafter\nextline\expandafter#1\fi}

\def\element#1 #2 #3 #4 #5\end{\node[name=#2, Element]{\NaturalElementTextFormat{#1}{#4}{#2}{#3}};}

\begin{document}
\section{Elemente}
\begin{tikzpicture}[font=\sffamily, scale=0.45, transform shape]

\tikzstyle{ElementFill} = [fill=yellow!15]
\tikzstyle{Element} = [draw=black, ElementFill,
    minimum width=2.75cm, minimum height=2.75cm, node distance=2.75cm]

\foreachline{elements.txt}\element
\end{tikzpicture}
\end{document}
Basilius Sapientia
User
Beiträge: 46
Registriert: Freitag 5. September 2014, 22:34

Vielen Dank! Allerdings ergibt dies eine Menge Warnings und Element 118 ist das einzige Element, das angezeigt wird. Was mache ich falsch?

PS! Auch wenn ich jetzt das Ergebnis jetzt in LaTeX habe, ist es dann irgendwie möglich doch alles in Python zu gestalten? Es reicht auch, wenn du zu den verschiedenen Pythonexempel verlinkst. Es ist nur, dass ich in meinem Studium ganz sicher Listen bekomme - Listen mit Daten und Symbolen. Deshalb wüsste ich gerne, wie man Listen lädt und die einzelnen Säulen und Reihen benennt, bestimmte Reihen (die Errors ergeben würden) ignoriert - und wie man mit print ganze Listen nach einem bestimmten Muster aus"druckt". Wie bereits gesagt, ein paar Links würden mir auch mehr als reichen :-) ... habe natürlich schon gegoogelt, habe aber irgendwie nicht das richtige gefunden :/
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Basilius Sapientia: dass alles übereinander gedruckt wird, liegt daran, dass die einzelnen Nodes nicht in Relation zueinander gesetzt werden. Das müßtest Du also auch noch irgendwie reinprogrammieren.
Nur Introduktionen zu lesen, reicht nicht, man muß die Tutorials auch durcharbeiten, damit man etwas versteht.
BlackJack

@Basilius Sapientia: Ein bisschen mehr als die zwei Standardkommentarzeilen sollte man aber schon hinbekommen wenn man die Grundlagen gelernt hat.

Vielleicht als Hinweise noch das `csv`-Modul aus der Standardbibliothek um das aufteilen der Eingabezeilen nicht selber machen zu müssen und man kann da dann auch gleich einen `DictReader` nehmen um die Kopfzeile sinnvoll zu nutzen und dann bei den Platzhaltern Namen statt Nummern zu verwenden.

Da LaTeX die geschweiften ausgiebig Klammern benutzt, würde ich vielleicht `string.Template` statt der `format()`-Methode auf Zeichenketten verwenden.
Antworten