Matroids Matheplanet Forum Index
Moderiert von Bilbo matph
Matroids Matheplanet Forum Index » Informatik » Python Liste in Liste sortieren
Autor
Schule Python Liste in Liste sortieren
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 2491
  Themenstart: 2021-07-30

Hallo, hab jetzt hier solcherart Listen: [[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]] Die Unterlisten (Tripel) möchte ich numerisch sortiert nach der 1. Zahl der jeweiligen Unterliste, bei Gleichheit, nach der 3. u.s.w. u.s.f Und dann das eigentliche Problem: Ich hab nicht mal eine Idee dazu: Aus diesen 9 Unterlisten müssen die Tripel ausgesucht werden, die folgende Bedingungen erfüllen: 1. Der 1. Wert des Tripels muss jeweils ein anderer sein. 2. Der 2. und 3. Wert muss jeweils im selben Tripel verschieden sein, und auch vom 2. und 3. Wert der anderen Tripel. 3. Es muss die Frage beantwortet werden, wie gross die maximale Tripelmenge ist, die diese Bedingung erfüllen, also ob 4 oder 5 Tripel in so eine Menge versammelt werden können. ich hab momentan nicht mal eine Idee....


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 2567
  Beitrag No.1, eingetragen 2021-07-30

\quoteon(2021-07-30 20:53 - Bekell im Themenstart) Die Unterlisten (Tripel) möchte ich numerisch sortiert nach der 1. Zahl der jeweiligen Unterliste, bei Gleichheit, nach der 3. u.s.w. u.s.f \quoteoff Inwiefern unterscheidet sich das denn von der üblichen Sortierung? \sourceon python >>> sorted([[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]]) [[11, 21, 10], [11, 27, 16], [13, 19, 6], [13, 25, 12], [17, 21, 4], [17, 24, 7], [17, 27, 10], [19, 25, 6], [23, 27, 4]] \sourceoff --zippy


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

Danke Zippy, zum 2. Problem, ich kann doch jetzt nicht schreiben: if Wert 1 von Unterliste 1 != Wert 2 von Unterliste 2 usw. usf. Da krieg ich ja ellenlange Ifs, Wenn ich die Unterlisten alle permutiere.... Was tun? Hab ne Idee. (Beim Schwimmen gekommen) man nimmt nach dem sortieren das erste Tupel, spaltet es in zwei Listen "Diff" und "MinSub", dann nimmt man das zweite Tupel, probiert ob Diff denselben wert hat, wenn ja, verwerfen, wenn nein, prüfen ob MinSub andere werte sind, wenn nein, verwerfen, wenn ja einsortieren, usw. u.s.f. Ich glaube, dazu sagt man Backtracking, oder?


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2964
  Beitrag No.3, eingetragen 2021-07-31

Wenn man sehr komplexe, obskure Bedingungen stellt, wird deren Abfrage auch etwas aufwendiger. Rechne dein obiges Beispiel von Hand vor, dann kann man überlegen, wie man das möglichst leserlich implementiert. Es ist im Übrigen unsinnig alles auf einmal machen zu wollen. Da Filter kommutieren, kann man schrittweise vorgehen. Weiterhin ist es mutmaßlich unsinnig, mit Zahlentripeln zu rechnen, wenn die komplette Information in den letzten beiden Zahlen steckt. Angesichts deiner jüngeren Fragen scheint es ja kein Zufall zu sein, dass sich die erste Zahl als Differenz der letzten beiden ergibt. Falls ich deine Forderungen richtig verstehe, kann man 4 Paare ("Tripel") versammeln. \sourceon Python \numberson Liste = [ [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]] Paare = [(l[1],l[2]) for l in Liste] def ist_erlaubtes_paar(p1,p2): return p1[0]-p1[1] != p2[0]-p2[1] and p1[0] != p2[0] and p1[1] != p2[1] def finde_maximale_teilmenge(paare,teilmenge=[]): if not paare: return teilmenge loesung_mit = finde_maximale_teilmenge( [p for p in paare[1:] if ist_erlaubtes_paar(p,paare[0])], teilmenge + [paare[0]]) loesung_ohne = finde_maximale_teilmenge( paare[1:], teilmenge ) if len(loesung_mit) >= len(loesung_ohne): return loesung_mit return loesung_ohne print(sorted((a-b,a,b) for a,b in finde_maximale_teilmenge(Paare))) \sourceoff


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

Danke Einfältiger, ich muss Deinen Vorschlag jetzt erst mal durcharbeiten und verstehen..... braucht Zeit! Hab das Problem so gelöst: \sourceon Python \numberson Liste = [ [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]] Liste.sort() Liste.reverse() ListeDiff=[] ListeMinSub=[] Subliste=[] n=-1 for x in Liste: n+=1 if n == len(Liste): break Subliste=Liste[n] print("SL",Subliste) if Subliste[0] not in ListeDiff: ListeDiff.append(Subliste[0]) if Subliste[1] not in ListeMinSub and Subliste[2] not in ListeMinSub: ListeMinSub.append(Subliste[1]) ListeMinSub.append(Subliste[2]) print(n+1,"ListeDiff",ListeDiff) print(n+1,"ListeMinSub",ListeMinSub) print() if len(ListeMinSub)//2==len(ListeDiff): print("Es gibt eine Lösung") else: print("Es gibt, keine Lösung") \sourceoff Wie findest Du das? Jetzt kuckich, ob das deinem Vorschlag adaequat und ähnlich ist... Wenn ich die beiden Printen weglasse, bin sogar kürzer....


   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-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]