Python: Kleinsten Wert mit dem größten Wert innerhalb einer Liste tauschen?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet
Die Liste wird also von Groß zu Klein aufgelisten sehe ich das richtig?

Die Elemente der Liste werden in der Reihenfolge ausgegeben, wie du sie eingetragen hast. Sofern du keine explizite Sortierung vornimmst, erfolgt auch keine.

Ich habe den Eindruck, dass du die Ausgabe falsch wertest. Die ausgegebene Liste besteht bei dir aus einem Datumsobjekt: datetime.datetime(3, 1, 1, 0, 0) und einer Zahl (der Summe aller Bewertungen): 3.

Mein Ziel ist es erstmal die Werte für den besten Termin nur mit einer anderen Eingabe zu tauschen, wenn nicht bereits die kleinste Wertung für den Termin vorliegt.

Da du dir nur die Summe aller Bewertungen je Datum merkst, ist aktuell keine Trennung nach Nutzereingabe möglich.

Es wäre wohl besser, wenn du dir alle Eingaben sicherst und erst später auf ihrer Grundlage herumrechnest. Man könnte sich für eine Bewertung einen Typ anlegen:

class Bewertung:
  def __init__(self, mitglied, wert = -1):
    self.mitglied = mitglied
    self.wert = wert

# example usage
bewertung1 = Bewertung("Max")
bewertung1.wert = 0
bewertung2 = Bewertung("Moritz")
bewertung2.wert = 1

und für die Terminbewertungen ein Dictionary.

termin_bewertungen = {}

Als Keys können die Daten eingetragen werden, als Wert speicherst du eine Liste an Bewertungsobjekten. Eine andere Option (statt einem Dictionary) wäre ein weiterer Typ:

class Terminbewertung:
  def __init__(self, datum):
    self.datum = datum
    self.bewertungen = []

Der könnte später passenderweise auch mit den Methoden erweitert werden, die die Berechnungen vornehmen (z.B. Berechnung des Durchschnitts).

Der Einfachheit halber würde ich zudem die Werteskala umdrehen: Hohe Werte stehen für mehr Zustimmung als niedrige. Werte mt -1 (Standardwert) sollten nicht in die Rechnung mit einbezogen werden.

Nach Eingabe aller Werte könntest du jedenfalls leicht über alle getätigten Bewertungen eines bestimmten Datums laufen und schauen, inwiefern noch ein Tausch möglich ist. Ebenso kannst du dir mit Schleifen neue Konstellationen zusammenstellen. Zum Beispiel alle Bewertungen einer Person heraussuchen:

bewertungen_mitglied1 = {}

for terminbewertung in terminbewertungen:
  for bewertung in terminbewertung.bewertungen:
    bewertungen_mitglied1[terminbewertung.datum] = bewertung.wert

Edwardo23 
Beitragsersteller
 23.10.2021, 14:20

@regex9

Eine Frage noch... das Beispiel der class, wie kann ich das allgemein anwenden? Problem ist ja, dass ich als Bewertung nicht habe:

Wie ist die Bewertung von Person "y" für den Termin "x": 1 2 3 4

Dann könnte man ja mit folgendem arbeiten:

bewertung = list(map(int, input("\n Wie ist die Bewertung von {mitglied} für {termin[0]:%A, der %d.%m.%Y}: ").strip().split()))

Und hätte als Ausgabe bei obiger Eingabe:

[1, 2, 3, 4]

Sondern, dass die Termine nach und nach und auch die Bewertungen somit nach und nach abgefragt werden...

Wenn du mir da noch helfen könntest das für jede Person in eine Liste zu bekommen wäre das extrem klasse.

Man müsste wieder mit einer doppel-for-schleife arbeiten oder?

0
regex9  24.10.2021, 02:50
@Edwardo23

Die Eingabe der Bewertungen je Nutzer könnte so ablaufen:

# eingabe mitglieder ...

print("Geben Sie ...")
terminbewertungen = [Terminbewertung(datetime.strptime(datum.strip(), "%d.%m.%Y")) for datum in input().split(",")]

for mitglied in mitglieder:
  for terminbewertung in terminbewertungen:
    bewertungswert = int(input("Bewerte ..."))
    bewertung = Bewertung(mitglied, bewertungswert)
    terminbewertung.bewertungen.append(bewertung)

Du läufst also über alle Mitgliedernamen. Je Mitglied wird über alle Termine iteriert und dabei ein Bewertungsobjekt angelegt, bestehend aus Mitgliedsname und Wert. Dieses Bewertungsobjekt wird der Liste an Bewertungen für einen Termin angehängt.

Visuell könnte man sich die Struktur eines einzelnen Terminbewertungsobjekts noch einmal so vorstellen:

Terminbewertung
  datum
  bewertungen (Liste an Bewertungsobjekten)
    Bewertung
      mitglied
      wert
    Bewertung
      mitglied
      wert
    usw. ...
1
Edwardo23 
Beitragsersteller
 23.10.2021, 12:04

Kuss! Das versuche ich mal einzubauen, vielen Dank!!

0

Normalerweise kann man entsprechende Fragen am schnellsten und leichtesten an einem Minimalbeispiel erklären.

Deien Funktion zum Swappen bekommt ne Liste übergeben, aber es gehlen die Indices für min und max?


Edwardo23 
Beitragsersteller
 22.10.2021, 21:28

min und max hängen ja von dem Input und was der User eingibt ab, und ich wusste nicht wie ich das an einem kleinerem Beispiel demonstrieren soll, da die Liste, welche verändert werden soll, ja immer anders ausfällt. Mit so etwas habe ich noch nie wirklich gearbeitet, was der Grund für keine Alternative Fragestellungs-Möglichkeit war :(

Ich kann versuchen später nochmal eine etwas kleine Frage zu stellen... Danke für den Tipp auf jeden Fall!

0
KarlRanseierIII  22.10.2021, 21:58
@Edwardo23

Das Minimum und Maximum kannst Du natürlich mi min() und max() bestimmen, mit index() auch die Position, wobei das erste match gefunden wird.

Alternativ ginge auch sowas:

>>> l
[7, 8, 2, 10, 3, 120, 1, -10, 5, 12]
>>> min=max=0
>>> for i,v in enumerate(l):
...    if v>l[max]:
...        max=i
...    if v<l[min]:
...        min=i
...
>>> l[min],l[max]
(-10, 120)

So kannst Du mit einem Scan die Indices von Minimum und Maximum bestimmen.

0