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.