Vorbereitung auf meine Pythonklausur

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Hallo Leute,

ich bin im Informationsmanagementstudium, wo wir Python behandeln. Wir sind noch relativ am Anfang ( erster Kurs ), weswegen ich mich gerade noch bei simplen Sachen durchkämpfe. Ab und zu hänge ich bei einigen Aufgaben, wenn ich im Internet gucke, finde ich tausende Lösungswege, jedoch wird uns z.B. ein Programmskelett vorgegeben, womit wir arbeiten müssen. Z.B. zu meiner jetzigen Frage. Wir sollen aus einer Liste einen den kleinsten Wert ausgeben. Wie gesagt, habe ich schon viele Lösungswege mit dem min und max Wert gefunden, jedoch sollen wir dieses Programmskelett verwenden ( Anstelle der X's soll dann der Code folgen ):

Code: Alles auswählen

a = [18,15,22,25,11,29,31]
n = len(a)
XXXXXXXXXX
print "min(",a,") steht an Stelle",min
Die Aufgabe besagt:
Schreiben Sie ein Programm, das zu einer gegebenen Liste die Position berechnet, an welcher das kleinste Element steht. Verwenden Sie dazu das angegebene Programmskelett.
Bemerkung: das vorderste Elemente steht an der 0-ten Position, das zweitvorderste an der 1-ten Position usw. (Informatiker fangen halt gerne bei 0 an zu zählen.)

Ersetzen Sie auch hier nur die ausgeixte stelle durch (ein paar Zeilen) Python-Code. Die Ausgabe sollte dann wie folgt aussehen:

Code: Alles auswählen

min( [18, 15, 22, 25, 11, 29, 31] ) steht an Stelle 4
Wäre nett, wenn jemand was dazu sagen könnte mit einer Erklärung.

LG
Zuletzt geändert von Anonymous am Donnerstag 1. Juni 2017, 12:04, insgesamt 2-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Willkommen im Forum! Hast du dir denn schon etwas überlegt, wie du es lösen könntest?
Warum klappt es nicht mit den 1000 Lösungswegen, die du bereits im Netz gefunden hast?
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Dankeschön! Also ich gehe gerade nüchtern vor, welchen Lösungsweg man einschlägt.

Also ich habe eine Liste gegeben

Code: Alles auswählen

a = [18,15,22,25,11,29,31]
, woraus ich die Stelle des kleinsten Wertes ausgeben soll. Im Beispiel wäre das Ergebnis Stelle 4.
Das heißt ich muss zuerst die Länge der Liste ermitteln ( wie viele Werte sich dadrin befinden ), welches mir das Programmskelett vorgibt mit

Code: Alles auswählen

n = len(a)
Nun müsste ich die Liste ja "durchscannen" um alle Werte der Liste zu ermitteln, um den kleinsten Wert zu finden und an welcher Stelle dieser sich befindet. Und da stehe ich auf dem Schlauch. z.B habe ich Lösungen gesehen mit dem

Code: Alles auswählen

.index
, dann wäre allerdings im Programmskelett die funktion sinnlos und somit würde ich Fehlerpunkte in der Klausur bekommen.

LG
BlackJack

@sharete: Was an dem Codegerüst ziemlich übel ist, ist das offensichtlich der Index an dem das kleinste Element steht an den Namen `min` gebunden werden soll. Das ist a) inhaltlich falsch, denn es ist ja nicht das Minimum sondern der Index davon, und b) ist `min` der Name der eingebauten `min()`-Funktion, den man nicht an einen anderen Wert binden sollte. Insbesondere braucht man diese Funktion hier ja, und einen Namen im gleichen Namensraum auf total verschiedene Dinge zu binden, ist sehr verwirrend. Wozu man das `n` brauchen soll ist mir übrigens auch nicht klar. Die 'X'e lassen sich durch *eine* Zeile Code ersetzen, und der Ausdruck der dort verwendet wird, benötigt den Wert von `n` nicht. Schau Dir einfach mal an was es für Methoden auf Listen gibt.
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Leider komme ich nicht drauf und ich habe das Gefühl, dass mich momentan alles andere mehr verwirrt, als dass es mir weiterhilft :K
BlackJack

@sharete: Naja die offensichtliche aber nicht effizienteste Lösung wäre wohl das hier:

Code: Alles auswählen

In [40]: a = [18,15,22,25,11,29,31]

In [41]: a.index(min(a))
Out[41]: 4
Da wird `n` nicht gebraucht. Wenn man jetzt aber `n` brauchen sollte, was soll man dann implementieren? Darf man `min()` auf die Liste anwenden und muss den Effekt von `list.index()` selber programmieren? Darf man dabei `enumerate()` verwenden oder nicht? Oder soll man `min()` nicht auf die Liste anwenden und in einer Schleife Minimum *und* Index in einem Durchlauf ermitteln? wie sieht es dann mit `enumerate()` aus?

Meine Lösung wäre wahrscheinlich das hier falls es effizienter sein soll als die offensichtliche Lösung:

Code: Alles auswählen

In [42]: min((x, i) for i, x in enumerate(a))[1]
Out[42]: 4
Bleibt immer noch die Frage wozu man da `n` und mehr als eine Zeile brauchen soll. :-)

Wobei das wahrscheinlich erst für grössere Listen effizienter wird als `min()` und `list.index()` zu verwenden. Zumindest in CPython.
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Ich habe natürlich zu jeder Aufgabe die Lösung, habe allerdings nicht bewusst geguckt, wie der Dozent das haben möchte. Um es dir aber zu verdeutlichen poste ich einfach mal seine Lösung, vielleicht könntest du ja dazu erklären, was passiert?

Code: Alles auswählen

a = [18,15,22,25,11,29,31]
n = len(a)
min = a[0]
index = 0
i = 0
while i < n:
    if a[i] < min:
        min = a[i]
        index = i
    i+=1
        
print "min(", a, ") steht an Stelle", index

Danke für deine Hilfe!
Zuletzt geändert von Anonymous am Donnerstag 1. Juni 2017, 14:35, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Vielleicht kommt der Aufgabensteller auch eher aus der C-Welt und dachte an so etwas:

Code: Alles auswählen

for i in range(n):
EDIT: Da war ich wohl etwas zu langsam...
Meine Idee ging aber wohl in die richtige Richtung, nur nicht weit genug...
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@sharete: Dein Dozent will eigentlich C auf niederstem Niveau programmieren (und hält sich nicht an seine eigene Vorgabe). So etwas schreibt man nicht in Python. Will man "min" nicht benutzen, säße das vielleicht so aus:

Code: Alles auswählen

a = [18,15,22,25,11,29,31]
min_index = -1
min_value = None
for index, value in enumerate(a):
    if min_value is None or value < min_value:
        min_index = index
        min_value = value
print "min(", a, ") steht an Stelle", min_index
Ich wäre wohl damit gekommen:

Code: Alles auswählen

from itertools import count

a = [18,15,22,25,11,29,31]
min_index = min(zip(a, count())[1]
print "min(", a, ") steht an Stelle", min_index
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Sag dem Dozenten, dass wenn er C lehren will, soll er in C lehren und sich auch dran halten!
Wenn er Python lehren will, soll er die Sprache erstmal selbst verstehen.

So könnte ein Anfänger die Aufgabe in Python lösen:

Code: Alles auswählen

a = [18,15,22,25,11,29,31]
smallest_val = min(a)
smallest_index = a.index(smallest_val)
template = 'In der Liste ist das kleinste Element {}. Der Index ist {}'
text = template.format(smallest_val, smallest_index)
print(text)
Zuletzt geändert von Anonymous am Donnerstag 1. Juni 2017, 14:36, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Der Dozent will nicht C oder Python lehren, sondern Schleifen, Vergleiche, bedingte Anweisungen, kombinierte Werte, usw.
Dass ihm nur so ein dummes Beispiel eingefallen ist, das zudem mehr verwirrt als lehrt, kann man ihm durchaus ankreiden.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Hier eine Lösung in Prolog:
[codebox=prolog file=Unbenannt.txt]min([], AccMin, AccMin, AccIndex, AccIndexMin, AccIndexMin).

min([K|R], AccMin, Min, AccIndex, AccIndexMin, IndexMin) :-
K<AccMin,
IndexErhoeht is AccIndex+1,
min(R, K, Min, IndexErhoeht, AccIndex, IndexMin),
!.

min([_|R], AccMin, Min, AccIndex, AccIndexMin, IndexMin) :-
IndexErhoeht is AccIndex+1,
min(R, AccMin, Min, IndexErhoeht, AccIndexMin, IndexMin).

min([K|R], Min, IndexMin) :- min([K|R], K, Min, 0, 0, IndexMin).[/code]
Ausgabe:

Code: Alles auswählen

min([2,3,4,1,8], Element, Index).
Element = 1,
Index = 3
PS: Die angebotene Summe ist beachtlich.
BlackJack

Haskell:
[codebox=haskell file=Unbenannt.hs]minIndex xs = snd $ minimum $ zip xs [0..]


main :: IO ()
main =
let a = [18,15,22,25,11,29,31]
in putStrLn $ "min(" ++ show a ++ ") steht an Stelle " ++ show (minIndex a)[/code]
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Hey Leute, erstmal danke für eure Antworten, hat mir sehr geholfen!

@BlackJack, ich habe meinen Dozent gefragt, ob das in Falle einer Klausur ausreichen würde, wenn ich einfach nur mit

Code: Alles auswählen

a.index(min(a))
programmieren würde und es geht in Ordnung. Hätte also trotzdem volle Punktzahl erreicht.


Nun hätte ich aber eine neue Frage! Und zwar soll ich ein Programm schreiben, dass zwei Zahlen (x&y) vom Benutzer einliest, diese Summiert und ausgibt. Soweit so gut, easy umsetzbar. Als Zusatz sollen wir allerdings das Programm in eine Schleife packen, dass wenn der Benutzer bei x & y = 0 eingibt, dass Programm beendet, ansonsten fortführt. Bisher habe ich mir das so gedacht:

Code: Alles auswählen

def addition():
    eingabe1 = float(input("Eingabe :"))
    eingabe2 = float(input("Eingabe :"))
    ergebnis = eingabe1+eingabe2
    
    if eingabe1 and eingabe2 == 0:
        break
        
    else:
        print("x ="),eingabe1
        print("y ="), eingabe2
        print("x+y ="), ergebnis
addition()
Allerdings wird mir ein Fehler angezeigt: undefined: SyntaxError: 'break' outside loop. Und wie wäre der Befehl, dass er das Programm " neu startet " ?

LG
Zuletzt geändert von Anonymous am Sonntag 4. Juni 2017, 13:56, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@sharete: Ihr sollt ja das ”Programm” in eine Schleife packen. Wo ist denn diese Schleife?
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Ist mir dann auch aufgefallen :D. Ich habe es jetzt so umgeschrieben:

Code: Alles auswählen

eingabe1 = float(input("Eingabe: "))
eingabe2 = float(input("Eingabe: "))
ergebnis = eingabe1+eingabe2

while True:
    if eingabe1 and eingabe2 != 0:
        print("x ="),eingabe1
        print("y ="), eingabe2
        print("x+y ="), ergebnis
        
    else:
        break

Wenn ich jetzt 2 zahlen eingebe rechnet er es solange aus, bis er die Fehlermeldung TimeLimitError: Program exceeded run time limit. raushaut. Wie kann ich denn einen "restart" nach dem Ergebnis einläuten?
Zuletzt geändert von Anonymous am Sonntag 4. Juni 2017, 15:33, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@sharete: dann schau doch mal, was alles innerhalb Deiner Schleife ausgeführt wird. Wenn ihr Python2 benutzt, dann ist »float« überflüssig, oder »input« falsch. Die if-Bedingung sieht seltsam asymetrisch aus, so dass ich nicht erkennen kann, ob Du nur aus Versehen keinen Fehler machst oder »and« einfach nur falsch verstanden. Die Klammern bei print sind mißverständlich, vor allem, wenn man das dann mit Python3 ausführt.
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Okay ich habe es letztendlich hinbekommen, wie es sein sollt.

Code: Alles auswählen

while True:
    eingabe1 = float(input("Eingabe: "))
    eingabe2 = float(input("Eingabe: "))
    ergebnis = eingabe1+eingabe2
    print("x ="),eingabe1
    print("y ="), eingabe2
    print("x+y ="), ergebnis
        
    if eingabe1 == 0 and eingabe2 == 0:
        break


Ich muss dazu sagen, dass wir in der Klausur mit codeskulptor.org programmieren. Wäre in dieser Art und Weise "Formfehler" vorhanden, auch wenn es funktioniert?
Zuletzt geändert von Anonymous am Sonntag 4. Juni 2017, 15:44, insgesamt 2-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@sharete: Aus dem `input()` solltest Du ein `raw_input()` machen. Das `input()` von dieser Webseite verhält sich nicht so wie in einem echten Python.

Und die ``print``-Anweisungen sehen komisch bis verwirrend aus mit den Klammern. Die gehören da nicht hin. Die haben auch gar keinen Effekt.

Edit: Ich würde ja noch mal überlegen ob das Verhalten wenn der Benutzer für beide Werte 0 eingibt, wirklich so gewollt ist.
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

BlackJack hat geschrieben:@sharete: Aus dem `input()` solltest Du ein `raw_input()` machen. Das `input()` von dieser Webseite verhält sich nicht so wie in einem echten Python.

Und die ``print``-Anweisungen sehen komisch bis verwirrend aus mit den Klammern. Die gehören da nicht hin. Die haben auch gar keinen Effekt.

Edit: Ich würde ja noch mal überlegen ob das Verhalten wenn der Benutzer für beide Werte 0 eingibt, wirklich so gewollt ist.
Wo liegt der Unterschied zwischen float(input) und raw_input() ? Also ich meine die Aufgabe besagt, dass so oder so Zahlen eingetragen werden müssen, warum nicht gleich in float definieren?

Dazu kommt, dass ich das "Programm" mal mit raw_input umgeschrieben habe und dadurch die break Funktion nichtig wird.
Antworten