Seite 1 von 1

Liste - beide Hälften gleich groß?

Verfasst: Freitag 9. Oktober 2020, 19:37
von KatjesWunder
Hi,
wie kann ich in Python in einer Liste mit gerader Anzahl von Werten bspw. L=[3,5,6, 8,9,4] schauen ob die Summe der ersten Hälfte gleich der Summe der zweiten Hälfte ist? :?

Re: Liste - beide Hälften gleich groß?

Verfasst: Freitag 9. Oktober 2020, 20:43
von __blackjack__
@KatjesWunder: In dem Du die beiden Hälften aufsummierst und vergleichst ob da das gleiche Ergebnis bei heraus kommt.

Das sind alles sehr grundlegende Listenoperationen die man dafür braucht. Vielleicht behandelt Dein Grundlagentutorial die `sum()`-Funktion nicht. Die solltest Du Dir dazu mal anschauen. Alles andere sollte in jedem Material das die Grundlagen abdeckt vorkommen. Tut es jedenfalls im Tutorial in der Python-Dokumentation.

Re: Liste - beide Hälften gleich groß?

Verfasst: Samstag 10. Oktober 2020, 02:31
von snafu
Weitere Stichwörter, die für das Aufteilen der Liste in zwei Hälften wichtig sind, wären noch Slicing sowie die ganzzahlige Division...

Re: Liste - beide Hälften gleich groß?

Verfasst: Samstag 10. Oktober 2020, 04:28
von __blackjack__
Und man möchte vorher vielleicht testen ob die Anzahl der Elemente tatsächlich gerade ist — da gäbe es dann noch das Stichwort Modulo-Operator.

Re: Liste - beide Hälften gleich groß?

Verfasst: Samstag 10. Oktober 2020, 13:08
von KatjesWunder
__blackjack__ hat geschrieben: Freitag 9. Oktober 2020, 20:43 @KatjesWunder: In dem Du die beiden Hälften aufsummierst und vergleichst ob da das gleiche Ergebnis bei heraus kommt.

Das sind alles sehr grundlegende Listenoperationen die man dafür braucht. Vielleicht behandelt Dein Grundlagentutorial die `sum()`-Funktion nicht. Die solltest Du Dir dazu mal anschauen. Alles andere sollte in jedem Material das die Grundlagen abdeckt vorkommen. Tut es jedenfalls im Tutorial in der Python-Dokumentation.
Ich weiß, dass ich mit sum arbeiten muss, aber mir ist nicht richtig geläufig wie ich genau den Code schnipsel angeben muss, dass er erst die erste Hälfte addiert und dann die andere. PS: Totaler Anfänger bei Python.

Code: Alles auswählen

list= [2,5,7,8,9,5]
sum(list)
print (sum(list))

Re: Liste - beide Hälften gleich groß?

Verfasst: Samstag 10. Oktober 2020, 13:30
von snafu
Dann wäre es wohl eine gute Idee, wenn du dich mal mit den Stichwörtern beschäftigst, die dir in den zwei Beiträgen zuvor gegeben wurden. Ein bisschen eigene Recherche erwarten wir hier schon, auch von den Anfängern.

Im ersten Schritt kannst du ja gemäß deines Beispiels von 6 Elementen ausgehen. Demnach gehen deine Hälften offensichtlich vom ersten bis dritten sowie vom vierten bis sechsten Element. Wie kann man das in Python in einem Rutsch umsetzen? Es gibt da eine spezielle Syntax, die unter anderem bei Zeichenketten angewendet wird.

Anschließend überlegst du dir, wie du eine Liste mit beliebiger Länge unter Anwendung einer (ziemlich simplen) Rechenformel aufteilen kannst.

Und im dritten Schritt kommt halt die Sache mit der Summe ins Spiel...

Re: Liste - beide Hälften gleich groß?

Verfasst: Samstag 10. Oktober 2020, 13:35
von KatjesWunder
snafu hat geschrieben: Samstag 10. Oktober 2020, 13:30 Dann wäre es wohl eine gute Idee, wenn du dich mal mit den Stichwörtern beschäftigst, die dir in den zwei Beiträgen zuvor gegeben wurden. Ein bisschen eigene Recherche erwarten wir hier schon, auch von den Anfängern...

Re: Liste - beide Hälften gleich groß?

Verfasst: Samstag 10. Oktober 2020, 13:37
von KatjesWunder
snafu hat geschrieben: Samstag 10. Oktober 2020, 13:30 Dann wäre es wohl eine gute Idee, wenn du dich mal mit den Stichwörtern beschäftigst, die dir in den zwei Beiträgen zuvor gegeben wurden. Ein bisschen eigene Recherche erwarten wir hier schon, auch von den Anfängern.

Im ersten Schritt kannst du ja gemäß deines Beispiels von 6 Elementen ausgehen. Demnach gehen deine Hälften offensichtlich vom ersten bis dritten sowie vom vierten bis sechsten Element. Wie kann man das in Python in einem Rutsch umsetzen? Es gibt da eine spezielle Syntax, die unter anderem bei Zeichenketten angewendet wird.

Anschließend überlegst du dir, wie du eine Liste mit beliebiger Länge unter Anwendung einer (ziemlich simplen) Rechenformel aufteilen kannst.

Und im dritten Schritt kommt halt die Sache mit der Summe ins Spiel...
das wars. Ein range mit einbauen... Das war der Denkanstoß der hier gefehlt hatte, danke :)

Re: Liste - beide Hälften gleich groß?

Verfasst: Samstag 10. Oktober 2020, 13:42
von snafu
Bei ungerader Länge kann man ja schlecht gleiche Teile nehmen. 7 Bonbons lassen sich nicht gerecht aufteilen, außer man isst eines selber. :)

Aber im Ernst: Da kommt es halt darauf an, ob als Eingabe eine ungerade Zahl von Elementen erlaubt ist und falls ja, ob die Listen dann unterschiedlich lang sein sollen bzw welche dann die längere wäre. Oder ob womöglich wirklich das mittlere Element unterschlagen werden soll. Oder was auch immer. Das ist schlichtweg eine Defintionssache in der Aufgabenstellung.

Re: Liste - beide Hälften gleich groß?

Verfasst: Samstag 10. Oktober 2020, 13:45
von snafu
KatjesWunder hat geschrieben: Samstag 10. Oktober 2020, 13:37 Ein range mit einbauen... Das war der Denkanstoß der hier gefehlt hatte, danke :)
Mit range() ist es auch lösbar, aber noch einfacher mit dem oben schon erwähnten Slicing.

Re: Liste - beide Hälften gleich groß?

Verfasst: Samstag 10. Oktober 2020, 14:31
von __blackjack__
@snafu: 7 🍬s entsprechen nicht der Spezifikation der (bisher bekannten) Aufgabenstellung, das ist also undefiniertes Verhalten und es kann alles passieren: Ich würde in dem Fall alle 7 essen. 😋

Re: Liste - beide Hälften gleich groß?

Verfasst: Sonntag 11. Oktober 2020, 14:33
von DeaD_EyE
Das wichtigste wäre erst mal zu verstehen wie man Bereichen bei Listen/Tupel oder anderen Sequenzen selektiert.

Wenn du eine Liste mit gerader Anzahl von Elementen hast und diese in der Mitte teilen möchtest, teilst du die Länge der Liste durch 2.
Da Python die Indizes bei 0 anfangen und das Ende eines Bereichs Exklusive ist, passt das ziemlich gut.

Code: Alles auswählen

L = [1, 2, 3, 4, 5 ,6]
half = len(L) // 2 # // == integer division
print("Größe der halben Liste", half)
print(f"Erste Hälfte: [:{half}]")
print(f"Zweite Hälfte: [{half}:]")

print(L[:half])
print(L[half:])
Nun gibt es noch das Problem mit der Länge der Sequenz. Wenn die Länge der Sequenz ungerade ist, kann die Sequenz nicht in zwei gleich große Teile unterteilen.
Also muss man diesen Fehler abfangen oder mal nachfragen was bei ungeraden Sequenzen passieren soll.

Um zu prüfen, ob etwas durch 2 teilbar ist, bietet sich die Modulo-Operation an.

Code: Alles auswählen

zahl = 66
if  zahl % 2 == 0:
    print(zahl, "ist durch 2 teilbar")
else:
    print(zahl, "kann nicht durch 2 geteilt werden")
Kombiniert mit einer Exception könnte das in einer Funktion so aussehen:

Code: Alles auswählen

def half_size(sequence):
    if sequence % 2 != 0:
        raise ValueError("Sequenz hat eine ungerade Anzahl von Elementen")
    # wenn die Bedingung wahr ist, wird der ValueError ausgegben
    # und das return statement wird nicht ausgeführt
    return len(sequence) // 2

Das dann kombiniert in einer Funktion, die z.B. erst mal nur die Summen der beiden Seiten ausgibt. Vielleicht möchte man die Werte noch verarbeiten.

Code: Alles auswählen

def sum_half(sequence):
    if len(sequence) % 2 != 0:
        raise ValueError("Sequence must be even length")
    half = len(sequence) // 2
    return sum(sequence[:half]), sum(sequence[half:])

    
# eine weitere Funktion kann dann das machen, was ursprünglich die Aufgabe gewesen ist
def equal_sum(sequence):
    left, right = sum_half(sequence)
    return left == right


my_list = [11, 44, 11, -11, 88, -11]
print(equal_sum(my_list))


print(equal_sum([1, 2, 3])) # boom
Ich hoffe, das was nicht zu kompliziert. Der Code könnte auch auf Modulebene ohne Funktionen geschrieben werden. Der Code lässt sich dann aber an anderen Stellen im Programm nicht wieder verwenden. Funktionen lassen sich auch leichter testen.

PS: Buchstaben für Namen sind .... Der WTF-Counter schnellt bei Code-Reviews in die Höhe, wenn durch nur x, y, m, n, i, l, k usw. vorkommt. Man sollte Namen verwenden, die Menschen verstehen. Unter L kann sich niemand etwas vorstellen. Da gibt es ein Regelwerk: https://www.python.org/dev/peps/pep-0008/
Mir hat damals das Buch "Idiomatic Python" sehr geholfen.

EDIT: Kleine Verbesserung in der sum_half Funktion:

Code: Alles auswählen

def sum_half(sequence):
    half, rest = divmod(len(sequence), 2)
    if rest != 0:
        raise ValueError("Sequence must be even length")
    return sum(sequence[:half]), sum(sequence[half:])
Keine Ahnung ob divmod schneller ist als eine Modulo-Operation gefolgt von einer Integer-Division, aber für mich sieht es eleganter aus.
Die Funktion divmod teilt das erste Argument durch das zweite und gibt als Erstes das Ergebnis der Integer-Division zurück und das Zweite ist der Rest.