Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Python Dic
Autor
Schule Python Dic
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 2674
  Themenstart: 2021-05-21

Hallo, ich habe jetzt diese schöne Tabelle erstellt von Python aus in Excel: https://matheplanet.com/matheplanet/nuke/html/uploads/b/23651_FPZ-TabelleZahlen.png Ich hätte jetzt gerne díeselbe Tabelle, nur statt der Zahlen in den Fächern, alle Primcatoren aufgelistet. Also statt 9 soll dann dort in der entsprechenden Zelle 3,3 stehen und statt 15 3,5. Die Primfactoren selber auslesen ist nicht das Problem. Das hab ich alles fertig. Das Problem besteht für mich darin, für jede Zahl die PF in eine Liste zu packen und automatisch zu entpacken. Bei wenig (hier 4 Stück) hab ich das früher mal so gelöst: \sourceon Python \numberson for n in range(8,Grenze,8): n1=n+1 n3=n+3 n5=n+5 n7=n+7 liste_n1=ermittel_primfactoren(n1) liste_n3=ermittel_primfactoren(n3) liste_n5=ermittel_primfactoren(n5) liste_n7=ermittel_primfactoren(n7) pfn1="" for x in liste_n1: pfn1 = pfn1+str(x)+", " pfn3="" for x in liste_n3: pfn3 = pfn3+str(x)+", " pfn5="" for x in liste_n5: pfn5 = pfn5+str(x)+", " pfn7="" for x in liste_n7: pfn7 = pfn7+str(x)+", " ws.append([n//8,n,pfn1,pfn3,pfn5,pfn7,".....",len(liste_n1),len(liste_n3),len(liste_n5),len(liste_n7)]) wb.save("/Users/Desktop/Exceldat/8mod7RestPrimfaktoren.xlsx") \sourceoff Diese Lösung verbietet sich hier. Ich denke, man müßte die kleinen Listen, wo die jeweils wenigen Primfactoren drin sind, in ein Dic packen, und dann automtisch entpacken. Aber, wie ist das möglich?


Wahlurne Für Bekell bei den Matheplanet-Awards stimmen
   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 3079
  Beitrag No.1, eingetragen 2021-05-21

Hier ein Beispiel, wie man das lösen könnte. \sourceon Python \numberson # Faktorisiere Intervall [0,N] # Bsp.: faktorisiere(10) -> # [{},{},{2:1},{3:1},{2:2},{5:1},{2:1,3:1},{7:1},{2:3},{3:2},{2:1,5:1}] def faktorisiere(N): L = [[n,{}] for n in range(N+1)] p = 2 while p*p<=N: e = 1 while p**e <= N: for t in range(p**e,N+1,p**e): if not p in L[t][1]: L[t][1][p]=0 L[t][1][p] += 1 L[t][0] //= p e+=1 p+=1 while p*p <= N and L[p][0] 1: L[n][1][p]=1 L[n][0] = 1 return [f for n,f in L] # Drucke die Faktorisierung geordnet nach Anzahl der Primfaktoren # Bsp.: printFaktoren(10): -> # Ordnung 0: 0{}, 1{}, # Ordnung 1: 2{2:1}, 3{3:1}, 5{5:1}, 7{7:1}, # Ordnung 2: 4{2:2}, 6{2:1,3:1}, 9{3:2}, 10{2:1,5:1}, # Ordnung 3: 8{2:3}, def printFaktoren(N): Fakt = faktorisiere(N) MaxOrd = max(sum(f[p] for p in f) for f in Fakt) ausgabe = "" for ord in range(MaxOrd+1): ausgabe += f"Ordnung {ord}:\t" for n in range(N+1): f = Fakt[n] if sum(f[p] for p in f) == ord: ausgabe += f"{n} {f}, " ausgabe += "\n" return ausgabe print(printFaktoren(20)) \sourceoff Ausgabe: Ordnung 0: 0 {}, 1 {}, Ordnung 1: 2 {2: 1}, 3 {3: 1}, 5 {5: 1}, 7 {7: 1}, 11 {11: 1}, 13 {13: 1}, 17 {17: 1}, 19 {19: 1}, Ordnung 2: 4 {2: 2}, 6 {2: 1, 3: 1}, 9 {3: 2}, 10 {2: 1, 5: 1}, 14 {2: 1, 7: 1}, 15 {3: 1, 5: 1}, Ordnung 3: 8 {2: 3}, 12 {2: 2, 3: 1}, 18 {2: 1, 3: 2}, 20 {2: 2, 5: 1}, Ordnung 4: 16 {2: 4}, Mit leichten Modifikationen kann man das natürlich anders formattieren, unerwünschte Primzahlen wie die 17 ignorieren, als lesbares csv in eine Datei schreiben oder gleich eine schöne Latextabelle erstellen.


Wahlurne Für DerEinfaeltige bei den Matheplanet-Awards stimmen
   Profil
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 2674
  Beitrag No.2, vom Themenstarter, eingetragen 2021-05-21

Du bist aber schnell, Einfältiger! 8:50 - 9:15 = 25 min Auf jeden Fall ein großes Danke, muß mich erst orientieren.... Es ist schnell und schwierig für mich! Aber, es löst sich ... warum schreibst Du: \sourceon Python \numberson L = [[n,{}] for n in range(N+1)] \sourceoff Selbst interpretiert: Hier deklarierst Du eine Liste, in der lauter Unter-Listen sind (für jedes N eine), und darin Key n und Values {} eines Dic. Stimmt das? Das "range(N+1)" heißt: Es wird nur die obere Grenze gegeben. Wenn Selbst das modifiziert zu: \sourceon Python \numberson L = [[n,{}] for n in range(3,(N+1),2] # Weil Selbst will nur die ungeraden Zahlen! \sourceoff dann streikt er: "list index out of range" Was hat Selbst mißinterpretiert?


Wahlurne Für Bekell bei den Matheplanet-Awards stimmen
   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 3079
  Beitrag No.3, eingetragen 2021-05-21

Frage 1: Nein, das stimmt nicht. Im erweiterten Primzahlsieb stehen zu Beginn einfach Paare aus der Zahl selbst und einem leeren Dict, in dem die Primteiler gespeichert werden. Frage 2: Du hast ein Primzahlsieb und legst ein Feld mit nur knapp der Hälfte der Zahlen an. Also gibt es einen Indexfehler, sobald man auf die fehlende Hälfte zugreift. Wenn du bestimmte Primzahlen (ob die 2, die 17, die 31 oder was und warum auch immer spielt keine Rolle) ignorieren willst, dann wäre es wesentlich einfacher und sinnvoller, diese nachher beim Zusammenstellen der Ausgabe zu filtern.


Wahlurne Für DerEinfaeltige bei den Matheplanet-Awards stimmen
   Profil
Bekell hat die Antworten auf ihre/seine Frage gesehen.
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-2022 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]