Seite 1 von 3

Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 11:37
von sharete
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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 11:44
von Zizibee
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?

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 12:08
von sharete
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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 12:10
von 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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 12:37
von sharete
Leider komme ich nicht drauf und ich habe das Gefühl, dass mich momentan alles andere mehr verwirrt, als dass es mir weiterhilft :K

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 12:58
von 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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 13:05
von sharete
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!

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 13:09
von Zizibee
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...

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 13:17
von Sirius3
@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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 13:50
von DeaD_EyE
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)

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Donnerstag 1. Juni 2017, 14:52
von Kebap
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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 11:27
von Üpsilon
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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 12:22
von 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]

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 12:45
von sharete
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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 13:59
von BlackJack
@sharete: Ihr sollt ja das ”Programm” in eine Schleife packen. Wo ist denn diese Schleife?

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 15:17
von sharete
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?

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 15:32
von Sirius3
@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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 15:37
von sharete
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?

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 15:49
von 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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 15:57
von sharete
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.