Liste - beide Hälften gleich groß?

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
KatjesWunder
User
Beiträge: 4
Registriert: Freitag 9. Oktober 2020, 19:21

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? :?
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Weitere Stichwörter, die für das Aufteilen der Liste in zwei Hälften wichtig sind, wären noch Slicing sowie die ganzzahlige Division...
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
KatjesWunder
User
Beiträge: 4
Registriert: Freitag 9. Oktober 2020, 19:21

__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))
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
KatjesWunder
User
Beiträge: 4
Registriert: Freitag 9. Oktober 2020, 19:21

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...
Zuletzt geändert von KatjesWunder am Samstag 10. Oktober 2020, 13:38, insgesamt 1-mal geändert.
KatjesWunder
User
Beiträge: 4
Registriert: Freitag 9. Oktober 2020, 19:21

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 :)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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. 😋
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
DeaD_EyE
User
Beiträge: 1011
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten