Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Python: Zugriff auf Werte in Dictionaries
Autor
Schule Python: Zugriff auf Werte in Dictionaries
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 2517
  Themenstart: 2021-07-26

Hallo, will den value zum key hochzählen.... \sourceon Python \numberson BelegteZellen=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] belegteZellen={15:0,16:1,17:5} x=0 if len(BelegteZellen) in belegteZellen: x = belegteZellen.get(2,0) #<- Hier soll der Value (5) vom 3. Item (Zeile 2) in das x rein print(x) x +=1 belegteZellen.update({len(BelegteZellen):x}) else: belegteZellen.update({len(BelegteZellen):1}) print(belegteZellen) \sourceoff ich krieg irgendwie den bestehenden Value zum 3. Item nicht in das x rein..... obwohl zur getfunktion geschrieben steht: get() - Returns the value of the specified key


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2999
  Beitrag No.1, eingetragen 2021-07-26

Dokumentation sagt: get Description Returns the value for key in the dictionary; if not found returns a default value. Syntax dict. get(key[, default]) key Required. A key in the dictionary. default Optional. Value that is returned when the key is not found. Defaults to None, so that this method never raises a KeyError. Return Value The value of the key. belegteZellen besitzt keinen key 2. Also wird der von der dir spezifizierte default-Value von 0 ausgegeben. Vielleicht meinst du ja: \sourceon Python \numberson x = belegteZellen.get(17,0) # oder falls Existenz vorher bekannt x = belegteZellen[17] \sourceoff


   Profil
Bilbo
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 03.01.2005
Mitteilungen: 2028
  Beitrag No.2, eingetragen 2021-07-26

Hallo Bekell, der Zugriff auf Werte in Dictionaries erfolgt doch über den Schlüssel, nicht über irgendeine Reihenfolge ("drittes Element"). Dictionaries kennen - im Unterschied zu Listen - auch gar keine Reihenfolge ihrer Werte, selbst wenn die natürlich im Programmablauf in irgendeiner Reihenfolge dort aufgenommen werden. Kurzum: Du musst mit get(17,0) arbeiten, dann wird es funktionieren. Viele Grüße Thorsten [Die Antwort wurde vor Beitrag No.1 begonnen.]


   Profil
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 2517
  Beitrag No.3, vom Themenstarter, eingetragen 2021-07-26

Erledigt! Die Zeile muss lauten: \sourceon Python \numberson x = belegteZellen[len(BelegteZellen)] \sourceoff [Die Antwort wurde vor Beitrag No.1 begonnen.]


   Profil
helmetzer
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 14.10.2013
Mitteilungen: 1532
  Beitrag No.4, eingetragen 2021-07-26

Das zieht sich jetzt schon wie Kaugummi durch mehrere Threads: Wo man eine list benutzen kann, sollte man kein dictionary verwenden.


   Profil
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 2517
  Beitrag No.5, vom Themenstarter, eingetragen 2021-07-26

\quoteon(2021-07-26 13:41 - helmetzer in Beitrag No. 4) Das zieht sich jetzt schon wie Kaugummi durch mehrere Threads: Wo man eine list benutzen kann, sollte man kein dictionary verwenden. \quoteoff Widerspruch Helmetzer! Dict ist hier sinvoll! ich bekomme die Ausgabe: Spiegel {17: 17, 15: 36, 16: 48, 14: 4} Das heißt: es gibt unter den 105 Möglichkeiten 17 mit 17, 48 mit 16 etc. etc. Ich baue in Programme, die Zählen, gerne Sicherungen ein, indem ich Verschiedenes zähle, oder dasselbe in 2 Modi, um dann Kontrollsummen bilden zu können. Sowas ist bei Erbsenzählerei durchaus angebracht. habe nun von 3.234.846.615 möglichen Konstellationen die beiden gesuchten rausgefiltert mit meinem Algorithmus....


   Profil
helmetzer
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 14.10.2013
Mitteilungen: 1532
  Beitrag No.6, eingetragen 2021-07-26

Auch wenn ich den Eindruck habe, dass Du beratungsresistent bist, weise ich noch auf Folgendes hin: https://docs.python.org/3/faq/programming.html#faq-multidimensional-list


   Profil
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 2517
  Beitrag No.7, vom Themenstarter, eingetragen 2021-07-26

\quoteon(2021-07-26 13:54 - helmetzer in Beitrag No. 6) Auch wenn ich den Eindruck habe, dass Du beratungsresistent bist, weise ich noch auf Folgendes hin: \quoteoff Beratungsresistent??? Wie kommst Du darauf? Dann würd ich wohl nicht fragen, oder denkst Du, ich will die freundlichen Leute hier foppen? Multilist, also "List in List" hab ich ja auch benutzt! z. B. auf Deinen Rat hin hier: Entfernungen1 [[17, 24, 7], [13, 19, 6], [17, 21, 4], [11, 21, 10], [19, 25, 6], [13, 25, 12], [23, 27, 4], [17, 27, 10], [11, 27, 16]] Aber wie gesagt, da ich Anfänger bin, (Hobby) programmier ich zur Sicherheit manches doppelt in Alternativen wegen der Ergebnissicherheit. Und vor allem: Mit Dict bin ich noch nicht so sicher....


   Profil
helmetzer
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 14.10.2013
Mitteilungen: 1532
  Beitrag No.8, eingetragen 2021-07-26

\quoteon(2021-07-26 13:59 - Bekell in Beitrag No. 7) Multilist, also "List in List" hab ich ja auch benutzt! z. B. auf Deinen Rat hin hier: Entfernungen1 [[17, 24, 7], [13, 19, 6], [17, 21, 4], [11, 21, 10], [19, 25, 6], [13, 25, 12], [23, 27, 4], [17, 27, 10], [11, 27, 16]] \quoteoff Damit kann ich leider wenig anfangen und deshalb ziehe ich mich jetzt zurück.


   Profil
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 2517
  Beitrag No.9, vom Themenstarter, eingetragen 2021-07-26

\quoteon(2021-07-26 14:12 - helmetzer in Beitrag No. 8) Damit kann ich leider wenig anfangen und deshalb ziehe ich mich jetzt zurück. \quoteoff Ih poste Dir nochmal den ganzen Code: \sourceon Python \numberson import openpyxl from openpyxl import Workbook from openpyxl.styles import Color, PatternFill, Font, Border from openpyxl.styles import colors from openpyxl.cell import Cell from openpyxl.utils import get_column_letter from sympy.ntheory import isprime Länge=29 # länge PZkleinerlL=[] # enthält PZkleinern mydic={} # enthält die Version Stelle als Key und Belegung (liste) als value version={} nr=0 N23=0 listofvalues=[] str0="" str1="" str2="" str3="" str4="" Zahlen=[] Zähler17=0 li=[] FreieZellen=[] BelegteZellen=[] GeradeKeys=[] UnGeradeKeys=[] Entfernungen1=[] Entfernungen2=[] Entfernungen3=[] Entfernung=[] Treffer=[] belegteZellen={}# Key=Anzahl belegte zellen, value=wie oft kommt vor leuchtendgrünFill = PatternFill(start_color="FF00FF00", end_color="FF00FF00", fill_type="solid") yellowFill = PatternFill(start_color="00FFFF00", end_color="00FFFF00", fill_type="solid") redFill = PatternFill(start_color="FFFF0000", end_color="FFFF0000", fill_type="solid") def def_belegteZellen(x): #belegteZellen={}# Key=Anzahl belegte zellen, value=wie oft kommt vor if x in belegteZellen: belegteZellen.update({x:2}) else: belegteZellen.update({x:1}) return belegteZellen wb = Workbook() ws=wb.active for x in range(1,Länge+1): Zahlen.append(x) ws.column_dimensions[get_column_letter(x)].width = 5 # nich so einfach ws.append(["Version/Zelle"]+Zahlen) #Kopfzeile ws.column_dimensions['A'].width = 11 for zahla in range(1,4): for zahlb in range(1,6): for zahlc in range(1,8): for key in range(1,Länge+1): # Hier macht er in alle keys eine 0 mydic[key]=[] for key in mydic: if key%3==zahla%3: mydic[key].append(3)# hier macht er die 3-en in die Valueliste if key%5==zahlb%5: mydic[key].append(5)# hier macht er die 5-en in die Valueliste if key%7==zahlc%7: mydic[key].append(7)# hier macht er die 7-en in die Valueliste #print("keyausfor",key,"keyausmydic",mydic.get(key)) li=mydic.get(key) # Version ohne Klammern in Excel str0="" for xi in li: str0=str0+str(xi)+"," str1=str(zahla)#Version str2=str(zahlb)#Version str3=str(zahlc)#Version str4=str1+str2+str3 #Versionsstring ws.cell(nr+2,1,str4) # die +2 sind, dmit die Kopfzeile nicht überschrieben wird if len(li)==1: # Färbeblock ws.cell(nr+2,key+1).fill = yellowFill if len(li)==2: ws.cell(nr+2,key+1).fill = leuchtendgrünFill if len(li)==3: ws.cell(nr+2,key+1).fill = redFill FreieZellen = [key for key in mydic if len(mydic[key])==0] BelegteZellen = [key for key in mydic if len(mydic[key])>0] ws.cell(nr+2,key+1,str0)#(reihe.spalte) nr+=1 print("Nr:",nr,"Version",zahla,zahlb,zahlc) print("Bestückung der Zeilen",mydic) print("BelegteKeys",len(BelegteZellen),"",BelegteZellen) if len(BelegteZellen) in belegteZellen: # Hier zählen wir, wie oft welche Belegungen vorkommen. x = belegteZellen[len(BelegteZellen)] x +=1 belegteZellen.update({len(BelegteZellen):x}) else: belegteZellen.update({len(BelegteZellen):1}) print("Spiegel",belegteZellen) if len(BelegteZellen)==17: Zähler17+=1 print("FreieKeys",len(FreieZellen),"",FreieZellen) for x in FreieZellen:# noch in Kurzform bringen if x%2==0: GeradeKeys.append(x) UnGeradeKeys= [k for k in FreieZellen if k%2!=0] print("GeradeKeys",GeradeKeys) print("UngeradeKeysGK",UnGeradeKeys) listofvalues=list(mydic.values()) #print("Listofvalues",listofvalues) #print("key",mydic.get(key),"key",key) #ws.append(["Version"]+listofvalues) for x in GeradeKeys: for i in UnGeradeKeys: if x>i and isprime(x-i) and (x-i)>7: Entfernung.append(x-i)#Diff Entfernung.append(x)# Minuend Entfernung.append(i)#Subtrahend EntfernungCopy = list(Entfernung) Entfernungen1.append(EntfernungCopy) Entfernung.clear() Entfernungen2.append(x-i) for x in UnGeradeKeys: for i in GeradeKeys: if x>i and isprime(x-i) and (x-i)>7: Entfernungen2.append(x-i) Entfernung.append(x-i)#Diff Entfernung.append(x)# Minuend Entfernung.append(i)#Subtrahend EntfernungCopy = list(Entfernung) Entfernungen1.append(EntfernungCopy) Entfernung.clear() print("Entfernungen2",Entfernungen2) list(set(Entfernungen2)) Entfernungen3=list([i for i in set(Entfernungen2) if Entfernungen2.count(i)<10 and i>7]) # Entfernung Duplikate, eigentlich sollen 3,5,7 hier auch raus.... print("Entfernungen2",[i for i in set(Entfernungen2) if Entfernungen2.count(i)<10 and i>7]) # Entfernung Duplikate, eigentlich sollen 3,5,7 hier auch raus.... print("Entfernungen3",Entfernungen3) if all(x in Entfernungen2 for x in [23,19,17,13,11]): N23+=1 print("N23:",N23,"Zähl17",Zähler17) print("Entfernungen1",Entfernungen1) if len(BelegteZellen)==17 and 23 in Entfernungen2 and len(Entfernungen3)==5: Treffer.append(nr) print() ws.append(["Permutatorprimii"]) wb.save("/Users/....../Desktop/ProjLeg/Exceldat/Permutator3-29.xlsx") GeradeKeys.clear() UnGeradeKeys.clear() Entfernung.clear() Entfernungen2.clear() Entfernungen1.clear() mydic.clear() print("Treffer",Treffer) \sourceoff Und es gibt einen Beweis, dass richtig programmiert und gerechnet worden ist: die beiden Ergebnisse: Treffer [8, 50] sind optisch invers. https://matheplanet.com/matheplanet/nuke/html/uploads/b/23651_InversesErgebnis.png Deswegen auch noch einmal Danke für Deine Assistenz, Helmetzer!


   Profil
Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen.
__blackjack__
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 23.09.2021
Mitteilungen: 40
  Beitrag No.10, eingetragen 2021-09-24

@Bekell: Das ist alles recht lang und unübersichtlich. So etwas teilt man normalerweise auf leichter verdauliche Häppchen in Form von Funktionen auf. Auch das Hauptprogramm kommt in eine Funktion, so dass man nicht Hauptprogramm und Funktionsdefinitionen unübersichtlich vermischt hat. Die einzige bisherige Funktion `def_belegteZellen()` wird nirgends verwendet, die kann weg. Man definiert nicht alle Namen einmal am Anfang, teilweise mit irgendwelchen Dummywerten die nie verwendet werden, weil die vor der tatsächlichen Verwendung viel später im Code durch einen anderen Wert ersetzt werden. Das macht das Programm unübersichtlicher und es ist auch schwerer Code in einzelne Funktionen heraus zu ziehen weil die Initialisierung von Variablen an ganz anderer Stelle steht, als der Code der die dann letztlich verwendet. Es passiert so auch leicht, dass man am Anfang Namen definiert, die man gar nicht braucht und das aber nicht so leicht merkt und vergisst die zu entfernen. Nicht benötigt werden am Anfang die Vorbelegung von `PZkleinerlL`, `version`, `listofvalues`, `str0`, `str1`, `str2`, `str3`, `str4`, `li`, `FreieZellen`, `BelegteZellen`, und `Entfernungen3`. Man kann auch noch weitere Definitionen vom Anfang weg bekommen, nämlich da wo dieses ungünstige Muster verwendet wird: \sourceon python container = create_container() ... for ... in ...: ... # `container` befüllen. ... container.clear() \sourceoff Die `clear()`-Methode benutzt man nur sehr selten, wenn es wirklich *wichtig* ist, dass das *selbe* Object verwendet wird. Ist es in der Regel nicht, und das ist auch nicht ganz ungefährlich, weil man sicher sein muss, dass dieses Objekt nicht irgendwo im Programm noch mit Inhalt benötigt wird, zum Beispiel weil man es in eine Datenstruktur gesteckt hat. Statt einen Container zu leeren, ist es üblich einfach einen neuen, leeren Container zu erstellen. Und zwar dann in der Schleife am *Anfang* bevor er dort das erste mal benutzt wird. Dann muss man die Codezeile nämlich nur *einmal* in den Quelltext schreiben, statt *zweimal*. \sourceon python # Also statt: container = create_container() ... for ... in ...: ... # `container` befüllen. ... container = create_container() # besser: for ... in ...: ... container = create_container() # `container` befüllen. ... \sourceoff Das betrifft `mydict`, `GeradeKeys`, `UngeradeKeys`, `Entfernungen1`, `Entfernungen2`, `Entfernungen3` und `Entfernung`. Also *alle* wo `clear()` aufgerufen wurde. Wenn man das umformt, sieht man bei `entfernung` wie unsinnig kompliziert der Code dort ist: \sourceon python entfernung = [] entfernung.append(x - i) # Diff entfernung.append(x) # Minuend entfernung.append(i) # Subtrahend entfernungCopy = list(entfernung) entfernungen_1.append(entfernungCopy) \sourceoff Die Kopie ist überflüssig, weil das ja eine neu erstellte Liste ist, und es ist auch nicht sinnvoll eine leere Liste zu erstellen und da dann mit drei einzelnen `append()`-Aufrufen genau drei Elemente rein zu stecken. Die ganzen Zeilen dampfen am Ende zu diesem Einzeiler ein: \sourceon python entfernungen_1.append([x - i, x, i]) \sourceoff Beziehungsweise wenn man sinnvollere Namen verwendet und die Differenz *einmal* ausrechnet, statt mehrfach: \sourceon python entfernungen_1.append([differenz, minuend, subtrahend]) \sourceoff Die drei verschachtelten ``for``-Schleife erzeugen das kartesische Produkt der drei Zahlenbereiche. Das kann man mittels `itertools.product()` in *einer* Schleife machen, und sich so zwei Ebenen Einrückung sparen. Davon ist auch `nr` abhängig, das man dann gleich mit `enumerate()` ebenfalls über die Schleife erzeugen lassen kann, so dass man diese Abhängigkeit leicht sehen kann, und das Initialisieren vor der Schleife und das Hochzählen irgendwo mitten im Schleifenkörper weg kommt. Was die nummerierten `str*`-Namen angeht: man muss nicht jedes kleine Zwischenergebnis an einen Namen binden, insbesondere wenn diese Namen keinen sinnvollen Informationsgehalt haben. Falls das was da mit `str0` veranstaltet wird eigentlich nur Kommas *zwischen* die Werte setzen sollte und das letzte Komma nur geduldet ist, dann ist das mit der `join()`-Methode auf Zeichenketten einfacher und kürzer in einem Ausdruck erledigt. `FreieZellen` und `BelegteZellen` werden an der falschen Stelle im Code berechnet. Und zwar *in* einer Schleife wo sie aber gar nicht verwendet werden. Erst nach der Schleife wird darauf zugegriffen, und da haben die Listen den Wert des letzten Schleifendurchlaufs. Die braucht man also nur *einmal* nach der Schleife erstellen, statt 29 mal in der Schleife wovon 28 mal das Ergebnis einfach verworfen wird ohne etwas damit zu tun. Alternativ könnte man die Listen in der Schleife Element für Element aufbauen, also in jedem Durchlauf ein Element hinzufügen. Oje, `BelegteZellen` und `belegteZellen` als Namen im gleichen Sichtbarkeitsbereich ist hart. Da kommt man leicht mal durcheinander. Wenn man sich an die Python-Namenskonventionen halten würde, wäre die Kombination `BelegteZellen` und `belegte_zellen` nicht ungewöhnlich, aber da wüsste man dann, dass das erste ein Datentyp/eine Klasse ist, und das zweite ein ”normaler” Wert, und nicht beides ”normale” Werte. Für `belegteZellen` bietet sich ein `collections.defaultdict` an um da Code zu sparen. Zeile 143 verbrät sinnfrei Rechenzeit. Da wird aus `Entfernungen2` eine Menge gemacht, und daraus eine Liste, und mit der wird dann nichts gemacht, die wird einfach wieder verworfen. Gleich danach wird auch eine Liste unnötig erstellt, kopiert, und verworfen, denn die „list comprehension“ erzeugt eine Liste und der `list()`-Aufruf kopiert die dann sofort noch mal. `Entfernungen2` ist als Liste ungünstig gewählt für das was mit den Daten gemacht wird. Eigentlich braucht man das ja als Zähler wie oft jede Differenz vorkommt. Dann sollte man das auch gleich so anlegen, als Abbildung von Differenz auf Anzahl. Das speichern der Exceldatei wird für jede neue Zeile gemacht. Das sollte man nur einmal am Ende machen, weil jedes mal die Datei komplett erzeugt überschrieben wird, was Zeitverschwendung ist. Aufgeräumt ist das bei mir jetzt ca. 3× so schnell. Und über 50% weniger Anweisungen, nur durch ein bisschen aufräumen und einfachen Umformungen ohne tatsächlich auf den Inhalt einzugehen was da gemacht wird: \sourceon python #!/usr/bin/env python3 from collections import defaultdict from itertools import product from openpyxl import Workbook from openpyxl.styles import PatternFill from openpyxl.utils import get_column_letter from sympy.ntheory import isprime FILENAME = "/Users/....../Desktop/ProjLeg/Exceldat/Permutator3-29.xlsx" # FILENAME = "test.xlsx" LIGHT_GREEN_FILL = PatternFill("solid", "FF00FF00", "FF00FF00") RED_FILL = PatternFill("solid", "FFFF0000", "FFFF0000") YELLOW_FILL = PatternFill("solid", "00FFFF00", "00FFFF00") FILLS = [YELLOW_FILL, LIGHT_GREEN_FILL, RED_FILL] def main(): laenge = 29 zahlen = range(1, laenge + 1) workbook = Workbook() sheet = workbook.active for x in zahlen: sheet.column_dimensions[get_column_letter(x)].width = 5 sheet.append(["Version/Zelle", *zahlen]) # Kopfzeile sheet.column_dimensions["A"].width = 11 treffer = [] belegte_zellen_spiegel = defaultdict(int) zaehler17 = 0 n23 = 0 for row_number, (zahl_a, zahl_b, zahl_c) in enumerate( product(range(1, 4), range(1, 6), range(1, 8)), 1 ): # # +1 damit die Kopfzeile nicht überschrieben wird. # sheet.cell(row_number + 1, 1, f"{zahl_a}{zahl_b}{zahl_c}") # # Hier macht er in alle keys eine 0 # mydic = {key: [] for key in zahlen} freie_zellen = [] belegte_zellen = [] for key in mydic: for i, zahl in zip([3, 5, 7], [zahl_a, zahl_b, zahl_c]): if key % i == zahl % i: mydic[key].append(i) reste = mydic[key] # # +1 damit die Kopfzeile nicht überschrieben wird. # sheet.cell(row_number + 1, key + 1, ",".join(map(str, reste))) fill_index = len(reste) - 1 if fill_index >= 0: sheet.cell(row_number + 1, key + 1).fill = FILLS[fill_index] belegte_zellen.append(key) else: freie_zellen.append(key) print("Nr:", row_number, "Version", zahl_a, zahl_b, zahl_c) print("Bestückung der Zeilen", mydic) print("BelegteKeys", len(belegte_zellen), belegte_zellen) # # Hier zählen wir, wie oft welche Belegungen vorkommen. # belegte_zellen_spiegel[len(belegte_zellen)] += 1 print("Spiegel", belegte_zellen_spiegel) if len(belegte_zellen) == 17: zaehler17 += 1 print("FreieKeys", len(freie_zellen), freie_zellen) gerade_keys = [] ungerade_keys = [] for x in freie_zellen: (gerade_keys if x % 2 == 0 else ungerade_keys).append(x) print("gerade_keys", gerade_keys) print("ungerade_keys", ungerade_keys) entfernungen_1 = [] entfernungen_2 = defaultdict(int) for minuenden, subtrahenden in [ (gerade_keys, ungerade_keys), (ungerade_keys, gerade_keys), ]: for minuend in minuenden: for subtrahend in subtrahenden: differenz = minuend - subtrahend if differenz > 7 and isprime(differenz): entfernungen_1.append((differenz, minuend, subtrahend)) entfernungen_2[differenz] += 1 print("entfernungen_1", entfernungen_1) print("entfernungen_2", entfernungen_2) # # Entfernung Duplikate, eigentlich sollen 3,5,7 hier auch # raus.... # entfernungen_3 = [ i for i, anzahl in entfernungen_2.items() if i > 7 and anzahl < 10 ] print("entfernungen_3", entfernungen_3) if all(x in entfernungen_2 for x in [23, 19, 17, 13, 11]): n23 += 1 print("N23:", n23, "Zähl17", zaehler17) if ( len(belegte_zellen) == 17 and len(entfernungen_3) == 5 and 23 in entfernungen_2 ): treffer.append(row_number) print() sheet.append(["Permutatorprimii"]) workbook.save(FILENAME) print("Treffer", treffer) if __name__ == "__main__": main() \sourceoff


   Profil
Bekell wird per Mail über neue Antworten informiert.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]