hallo, ich schlag mich schon seit vielen Tagen mit folgendem Problem herum:
(bei den Grundlagen in Büchern bin ich da auch nicht weitergekommen, vielleicht auch nicht, weil ich nicht weiß, wo ich suchen soll...)
Ich möchte einer Liste mit Zahlen eine Reihe von Zahlen hinzufügen.
Mit liste[] und liste.extend kein Problem, aber ein Anwender muß doch wohl die Zahlen über "input" eingeben, ich habe schon alles mir mögliche versucht,
z.B. liste.extend = int(input"zahlen: ")), oder einfach nur input mit anschließender umwandlung in integer und vieles mehr, aber ich habe keine Lösung gefunden..
Dabei ist es sicher einfach, ein User gibt ein paar Zahlen ein, (z.B. Lottozahlen, die der Liste hinzugefügt werden.)(python version 3.3)
vielen Dank für einen Tipp im voraus, Martin.
input bei liste
Mit extend erweiterst du die Liste um Elemente einer weiteren Liste. Wenn du ein einzelnes Element hinzufügen willst, dann verwende append. (siehe auch im Tutorial unter http://docs.python.org/3/tutorial/datas ... e-on-lists)
Aber auch dort solltest du darauf achten wie die korrekte Syntax ist. Mit der von dir vorgeschlagenen Syntax würdest du bei liste.append = element landen. append ist aber eine Methode und muss entsprechend aufgerufen werden. Folglich heißt es liste.append(element).
Aber auch dort solltest du darauf achten wie die korrekte Syntax ist. Mit der von dir vorgeschlagenen Syntax würdest du bei liste.append = element landen. append ist aber eine Methode und muss entsprechend aufgerufen werden. Folglich heißt es liste.append(element).
-
- User
- Beiträge: 66
- Registriert: Sonntag 21. April 2013, 10:12
okay, danke, das eine war ein Tippfehler, ich weiß, liste.extend().. Es soll eine Reihe von Zahlen sein, also extend, aber meine Frage bezog sich
auf die Eingabemöglichkeit eines potentiellen Users, der kann ja nicht Code eintippen, also das Ganze mit "input", das ist es, wohinter ich nicht komme..
wie ich in meiner ersten Anfrage schon geschildert habe, vielleicht könnt Ihr mir da ein wenig weiterhelfen..
Martin
auf die Eingabemöglichkeit eines potentiellen Users, der kann ja nicht Code eintippen, also das Ganze mit "input", das ist es, wohinter ich nicht komme..
wie ich in meiner ersten Anfrage schon geschildert habe, vielleicht könnt Ihr mir da ein wenig weiterhelfen..
Martin
@haeuslermartin: Da kann man entweder eine Schleife schreiben und den Benutzer nach jeder Zahl einzeln Fragen und die Zeichenkette in eine Zahl umwandeln und mit `append()` an die Liste anhängen, die man vor der Schleife als leere Liste angegeben hat. Oder man fragt den Benutzer nach allen Zahlen, die er zum Beispiel durch Leerzeichen getrennt eingeben kann, und verarbeitet diese Zeichenkette dann weiter. Trennen an den Leerzeichen in eine Liste, umwandeln jedes Elements in eine Zahl und anhängen der Zahl an die Liste in der am Ende die Zahlen stehen sollen.
Mal als Code:
Was hier natürlich fehlt ist die Behandlung von Fehleingaben. Wenn der Benutzer keine Zahlen eingibt, oder wenn er Zahlen ausserhalb von 1 und 49 eingibt, oder nicht jede Zahl nur einmal eingegeben wird.
Code: Alles auswählen
def main():
#
# Eingabe der Zahlen einzeln:
#
print('Lottozahlen eingeben:')
lottozahlen = list()
for i in range(6):
lottozahlen.append(int(input(' {0}. Zahl: '.format(i + 1))))
print(lottozahlen)
#
# Als „list comprehension”:
#
print('Lottozahlen eingeben:')
lottozahlen = [int(input(' {0}. Zahl: '.format(i + 1))) for i in range(6)]
print(lottozahlen)
#
# Eingabe aller Zahlen in einem `input()`:
#
lottozahlen = list()
print('Lottozahlen durch Leerzeichen getrennt eingeben:')
for string in input().split():
lottozahlen.append(int(string))
print(lottozahlen)
#
# Und wieder als „list comprehension”:
#
print('Lottozahlen durch Leerzeichen getrennt eingeben:')
lottozahlen = [int(string) for string in input().split()]
print(lottozahlen)
if __name__ == '__main__':
main()
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Nun der User kann natuerlich schon Code eingeben und den kann man auch recht gut auswerten:
Aber Benutzerfreundlich ist das nicht unbedingt.
Code: Alles auswählen
>>> answer = input()
[1, 2, 3, 23, 42]
>>> answer
'[1, 2, 3, 23, 42]'
>>> import ast
>>> ast.literal_eval(answer)
[1, 2, 3, 23, 42]
>>> numbers = []
>>> numbers.extend(ast.literal_eval(answer))
>>> numbers
[1, 2, 3, 23, 42]
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@cofi: Eine leere Liste mit `extend()` zu erweitern macht nicht so viel Sinn, da kann man doch gleich da Ergebnis von `literal_eval()` an `numbers` binden.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
@BlackJack: Natuerlich, ich wollte nur nahe am Eingangsbeispiel bleiben
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Was hälst du von json?cofi hat geschrieben:Aber Benutzerfreundlich ist das nicht unbedingt.
Code: Alles auswählen
>>> import json
>>> answer = input()
[1, 2, 3]
>>> answer
'[1, 2, 3]'
>>> meine_liste = json.loads(answer)
>>> meine_liste
[1, 2, 3]
>>> meine_liste.append(42)
>>> meine_liste
[1, 2, 3, 42]
>>>
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Willst du jetzt sagen, dass JSON benutzerfreundlicher sein soll?
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Wollte ich nicht, aber wenn ich mir anschaue, wie komplex/vielschichtig ast ist und wie schlicht json, dann würde ich das sogar sagen. Das sage ich nach einem Vergleich von dir(ast) (1000 Sachen) mit dir(json) (load und dump) im Hinblick auf das gegebene Problem.cofi hat geschrieben:Willst du jetzt sagen, dass JSON benutzerfreundlicher sein soll?
Xe
Hier zusätzlich noch eine anfängergerechte Variante, in der pro Zeile möglichst wenig geschieht:
Code: Alles auswählen
def main():
print('Lottozahlen eingeben:')
lottozahlen = []
for i in range(1,7):
eingabe_prompt = ' %s. Zahl: ' % (i,)
eingabe = input(eingabe_prompt)
lottozahl = int(eingabe)
lottozahlen.append(lottozahl)
lottozahlen.sort()
print(lottozahlen)
if __name__ == '__main__':
main()
@xeike: Von diesem Unterschied sieht doch aber Benutzer der etwas eingibt überhaupt nichts. Für den kann es doch egal sein wie Umfangreich der Verarbeitungscode ist. Was er sieht sind JSON oder Python-Code der nur aus literalen Werten bestehen darf. Da hat Python ein wenig mehr zu bieten, und damit auch zu lernen, aber im Fall von der Zahleneingabe als Liste ist das Python-Literal doch identisch mit JSON. Also gar kein Unterschied.
Das `ast`-Modul ist natürlich umfangreicher, weil es die gesamte Programmiersprache verarbeiten können muss. Das trifft aber nicht auf `literal_eval()` zu. Das ist ja nur ein kleiner Teil der Funktionalität, die das `ast`-Modul bietet.
Das `ast`-Modul ist natürlich umfangreicher, weil es die gesamte Programmiersprache verarbeiten können muss. Das trifft aber nicht auf `literal_eval()` zu. Das ist ja nur ein kleiner Teil der Funktionalität, die das `ast`-Modul bietet.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
@xeike: Der Benutzer ist hier derjenige, der die Daten eingibt, nicht der Programmierer. Und selbst der sieht von `ast` eben nur `literal_eval`.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- User
- Beiträge: 66
- Registriert: Sonntag 21. April 2013, 10:12
liebe Python-Gemeinde, lieber Blackjack, vielen Dank !!
ich habe mich für die Variante "Eingabe aller Zahlen entschieden, das ist sehr einfach und funktioniert wunderbar:
zum Beispiel:
lottozahlen = list([2,5,33,22,3]) #die bereits vorhandenen Zahlen
print('Lottozahlen durch Leerzeichen getrennt eingeben:')
for string in input().split():
lottozahlen.append(int(string))
print(lottozahlen)
#die Ausgabe in der shell:
Lottozahlen durch Leerzeichen getrennt eingeben:
2 33 32 43 45 1 7
[2, 5, 33, 22, 3, 2, 33, 32, 43, 45, 1, 7]
Die Behandlung von Fehleingaben fürchte ich, übersteigt meinen momentanen python-Horizont, ebenso die Arbeit mit importierten Modulen.. jetzt habe ich erstmal genug Material zum Lernen, und zu gegebener Zeit wäre ich froh, Euch wieder fragen zu dürfen.
Martin.
ich habe mich für die Variante "Eingabe aller Zahlen entschieden, das ist sehr einfach und funktioniert wunderbar:
zum Beispiel:
lottozahlen = list([2,5,33,22,3]) #die bereits vorhandenen Zahlen
print('Lottozahlen durch Leerzeichen getrennt eingeben:')
for string in input().split():
lottozahlen.append(int(string))
print(lottozahlen)
#die Ausgabe in der shell:
Lottozahlen durch Leerzeichen getrennt eingeben:
2 33 32 43 45 1 7
[2, 5, 33, 22, 3, 2, 33, 32, 43, 45, 1, 7]
Die Behandlung von Fehleingaben fürchte ich, übersteigt meinen momentanen python-Horizont, ebenso die Arbeit mit importierten Modulen.. jetzt habe ich erstmal genug Material zum Lernen, und zu gegebener Zeit wäre ich froh, Euch wieder fragen zu dürfen.
Martin.
Hi!
Bei den Lottozahlen kann u. a. folgendes passieren (in Klammern Möglichkeiten, das zu testen):
* zu viele oder zu wenige Zahlen ( len(Liste oder Menge) )
* Benutzer geben keine Zahlen sondern irgend etwas anderes ein (string.isdecimal())
* leere Eingabe, also einfach RETURN gedrückt ( len(eingabe) )
Damit hättest du dann schon eine Reihe von Fehlern abgefangen.
Wenn du die Lottozahlen sortiert ausgeben möchtest, dann kannst du lottozahlen.sort() probieren.
Xe
Wenn du mit einer Menge (set) arbeitest statt einer Liste, dann hättest du schon mal keine doppelten Einträge.haeuslermartin hat geschrieben:Die Behandlung von Fehleingaben fürchte ich, übersteigt meinen momentanen python-Horizont,
Bei den Lottozahlen kann u. a. folgendes passieren (in Klammern Möglichkeiten, das zu testen):
* zu viele oder zu wenige Zahlen ( len(Liste oder Menge) )
* Benutzer geben keine Zahlen sondern irgend etwas anderes ein (string.isdecimal())
* leere Eingabe, also einfach RETURN gedrückt ( len(eingabe) )
Damit hättest du dann schon eine Reihe von Fehlern abgefangen.
Wenn du die Lottozahlen sortiert ausgeben möchtest, dann kannst du lottozahlen.sort() probieren.
Xe
In diesem Fall nimm doch die anfängerfreundliche Variante (dafür ist sie da). In der Zeilehaeuslermartin hat geschrieben:Die Behandlung von Fehleingaben fürchte ich, übersteigt meinen momentanen python-Horizont
Code: Alles auswählen
lottozahl = int(eingabe)
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hm... ich sehe hier der *einzelnen* Eingabe von Zahlen keinen besonderen Vorteil eines sets. Ich kann genauso gut auf der Liste prüfen, ob die Zahl schon darin enthalten ist (``value in values``), bevor ich sie hinzufüge. Abgesehen von der schnelleren Laufzeit für das Prüfen bei sets, müsste man da ja analog vorgehen. Denn einfach einfügen und *danach* die Länge prüfen halte ich für umständlich. Dass ist eher dann sinnvoll, wenn der Benutzer alle Zahlen auf einmal eingibt und diese dann ausgewertet werden. Insofern ist set sicherlich nicht verkehrt, aber auch kein Muss in diesem Kontext.kbr hat geschrieben: (das lässt sich mit Sets zwar umgehen, aber dabei lernt man nichts).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert