Buchstaben eines Wortes in eine Liste einlesen

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.
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Sonntag 25. März 2012, 06:49

Hallo zusammen,

ich habe jtz schon gesucht, aber nix gefunden, wohl weil ich auch nicht genau wusste unter was. Von daher wäre ich auch nur mit einem Suchhinweis zufrieden.

Ich bin gerade dabei ein Übungsprogramm zu achreiben welches ein Wort buchstabe für Buchstabe in eine Liste einliest und dann solange zufällig die Buchstaben wieder zusammensetzt bis selbiges Wort wieder heraus kommt.

Meine Frage:
Wie kan ich ein Wort Buchstabe nach Buchstabe ib eine Liste einlesen?
Ich habe UNGEFÄHR so gedacht:

Code: Alles auswählen

.
.
.
def einlesen:
          for i in wort:
                           print(i)
wort = []
wort = input('Bitte hier ein Wort eingeben: ')
wortzwei.append(einlesen)
.
.
.
Danke im Voraus
P.
Zuletzt geändert von Anonymous am Sonntag 25. März 2012, 11:26, insgesamt 2-mal geändert.
Grund: Code-Tags hinzugefügt
BlackJack

Sonntag 25. März 2012, 07:43

@Faerelis: Bitte setze doch Python-Quelltext in die entsprechenden Tags, damit die Einrückung erhalten bleibt. Die ist in Python bekanntlich ein wichtiges Ausdrucksmittel ohne das man keinen Quelltext der Klassen- oder Funktionsdefinitionen, bedingte Verzweigungen, Schleifen, eben alle Syntaxkonstrukte mit einem Block zusammengehörender Anweisungen nicht auseinder halten kann.

Die (Teil)Aufgabe lässt sich mit *einem* Funktionsaufruf erledigen. Aber vielleicht versuchst Du es erst einmal *ernsthaft* selber bevor den jemand verrät. Denn das ist mit den Grundoperationen, die man kennen sollte, eigentlich ganz einfach zu lösen. Der gezeigte Quelltext nährt allerdings die Vermutung, dass Du da nicht wirklich systematisch drüber nachgedacht, und auch nichts tatsächlich ausprobiert und überprüft hast. Da wird eine syntaktisch nicht einwandfreie Funktion `einlesen` definiert, die ganz offensichtlich nichts einliest. Es wird `wort` ein Wert zugewiesen, der nicht benutzt wird, weil gleich in der nächsten Zeile ein anderer Wert zugewiesen wird. Mit dem wird dann auch nichts weiter getan. Und dann wird einer Liste (nehme ich jetzt mal an) die Funktion angehangen. Das macht alles gar keinen Sinn.

Suchhinweis wäre das Tutorial in der Python-Dokumentation. Im Allgemeinen Schleifen und im besonderen die Datentypen `str` und `list`. Eventuell noch die Dokumentation zu Listen (und Zeichenketten). Finde heraus was die für Eigenschaften und Operationen haben. Dann beschreibst Du mal Schritt für Schritt den Vorgang wie die Buchstaben einer Zeichenkette in eine Liste kommen können. Diese Beschreibung verfeinerst Du so lange in kleinere Schritte bis sie auf die Sprachkonstrukte und Operationen von Python abbildbar sind, und schon hast Du Dein (Teil)Programm.
problembär

Sonntag 25. März 2012, 15:51

Mich hat übrigens schon oft gestört, daß das hier nicht klappt:

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

a = "Hallo"
b = a.split("")
print b
Denn in Perl geht das durchaus:

Code: Alles auswählen

#!/usr/bin/perl

use warnings;
use strict;

my $a = "Hallo";
my @b = split("", $a);
foreach my $i (@b) {
    print "$i\n";
}
Benutzeravatar
/me
User
Beiträge: 3262
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Sonntag 25. März 2012, 16:41

problembär hat geschrieben:Mich hat übrigens schon oft gestört, daß das hier nicht klappt:

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

a = "Hallo"
b = a.split("")
print b
Warum split() wenn es auch einfacher geht?

Code: Alles auswählen

>>> a = 'Hallo'
>>> b = list(a)
>>> b
['H', 'a', 'l', 'l', 'o']
DasIch
User
Beiträge: 2519
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sonntag 25. März 2012, 19:43

problembär hat geschrieben:[...]
Denn in Perl geht das durchaus:

Code: Alles auswählen

#!/usr/bin/perl

use warnings;
use strict;

my $a = "Hallo";
my @b = split("", $a);
foreach my $i (@b) {
    print "$i\n";
}
In Python geht es auch, zwar mit weniger Code, ohne dass man noch eine zusätzliche Datenstruktur braucht und in leserlich aber man kann ja nicht alles haben.

Code: Alles auswählen

a = u"Hallo"
print u"\n".join(a)
problembär

Sonntag 25. März 2012, 21:59

/me hat geschrieben:

Code: Alles auswählen

>>> a = 'Hallo'
>>> b = list(a)
>>> b
['H', 'a', 'l', 'l', 'o']
Ah, cool, danke dafür!
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Dienstag 27. März 2012, 13:30

Danke zusammen, ich hab mir da den Kopf zerbrochen und iwas kompliziertes überlegt :( :-)

Dazu sag ich

Code: Alles auswählen

while Freude > nächste_Frage:
    post('Danke')
:-D
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Dienstag 27. März 2012, 14:20

Ich habe das jtz mal ein bisl an meinem mini-prog gearbeitet und such jtz eine mölichkeit listen-inhalte zu löschen. es funktioniert nicht mit del weil es kein strings unterstützt, was kann ich da nehmen?

mein prob ist wenn ich

Code: Alles auswählen

import random
versuch = 1
antwort = input('Starten? ja/nein -> ')
while antwort == 'ja':
    a = input('Bitte etwas eingeben: ')
    b = list(a)
    c = len(b)
    d = random.sample(b,c)
    while d != b:
        d = random.sample(b,c)
        versuch += 1
    print(versuch)
    antwort = input('Weiter machen ? ja/nein ')
ausführe funzt es(kurze erläuterung: das programm zerlegt wörter und setzt sie zufällig wieder zusammen bis das ursprungswort wieder hergestellt ist), aber wenn man dan das gleiche wort nochmal eingibt (aus testzwecken habe ich das mal gemachht) dann steigen die wiederholungen bis das wort wieder zusammengesetzt ist.

wie kann ich listen, die strings sind, bzw. woran liegt dieser eben beschriebene effekt?

danke

auch wenn er mir hier vllt nicht beantwortet werden sollte
EyDu
User
Beiträge: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 27. März 2012, 14:38

Hallo.

Für neue Fragen solltest du einen neuen Thread aufmachen. Um Zeichen aus Strings zu entfernen, solltest du in die Dokumentation zu ``str`` schauen, dort sind genügend Methoden vorhanden. Was dein Beispielcode mit dem Problem zu tun hat (es gibt übrigens Tags für Python), entzieht sich mir völlig.
Das Leben ist wie ein Tennisball.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Dienstag 27. März 2012, 14:54

Faerelis, wie sollte der Zufall wohl immer das gleiche Ergebnis liefern? Heißt bei zusammenbauen deines Wortes ist nicht gegeben das immer die gleichen Kombinationen auftreten, es kann auch mal eine doppelt oder gar nicht aufkommen.
jaessyfizzle
User
Beiträge: 6
Registriert: Freitag 24. Februar 2012, 21:45

Dienstag 27. März 2012, 16:11

Du setzt den Wert von versuch am Anfang deines Skriptes auf 1, nicht aber am Anfang deiner Schleife. Wenn du also ein neues Wort eingibst (bzw. das gleiche), so bleibt der alte Wert von versuch stehen und es wird die neue Anzahl von Schleifendurchläufen addiert. Heißt also, wenn er beim ersten mal 100 Schleifendurchläufe braucht, und beim zweiten nur 50, so wird trotzdem 150 ausgegeben.
Setz versuch mal am Anfang deiner Schleife auf 1 und gucke was dann ausgegeben wird.
Außerdem sollte man keine Namen wie a, b usw benutzen, sondern vielleicht wort oder ähnliches.
problembär

Dienstag 27. März 2012, 19:57

Faerelis hat geschrieben:... und such jtz eine mölichkeit listen-inhalte zu löschen.
Schätze mal, Du meinst,
... und suche jetzt eine Möglichkeit, Listeninhalte zu löschen.
Das ginge z.B. so:

Code: Alles auswählen

>>> a = ['H', 'a', 'l', 'l', 'o']
>>> a.remove("l")
>>> print a
['H', 'a', 'l', 'o']
Faerelis hat geschrieben:es funktioniert nicht mit del weil es kein strings unterstützt, was kann ich da nehmen?
"del()" löscht - mehr oder weniger zuverlässig - Objekte aus dem Speicher. Strings sind auch Objekte, Listen auch. Dies klappt offenbar auch (obwohl man's so normalerweise nicht macht):

Code: Alles auswählen

>>> a = ['H', 'a', 'l', 'l', 'o']
>>> del(a[0])
>>> print a
['a', 'l', 'l', 'o']
"del()" geht auch durchaus mit Strings:

Code: Alles auswählen

>>> b = "Ich bin ein String."
>>> print b
Ich bin ein String.
>>> del(b)
>>> print b
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'b' is not defined
Stimmt also noch nicht so ganz, was Du da schreibst.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7477
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 27. März 2012, 20:28

problembär hat geschrieben: "del()" löscht - mehr oder weniger zuverlässig - Objekte aus dem Speicher.
Genau genommen muss man bei `del` unterscheiden, welche Art von Aufruf vorliegt. In Deinem zweiten Beispiel löschst Du damit den Namen, nicht das Objekt! Folgender Ausschnitt verdeutlicht das:

Code: Alles auswählen

In [6]: s = "Ich bin ein String"

In [7]: c = s

In [8]: del s

In [9]: s
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/home/nelson/src/Python/scale/<ipython-input-10-f4d5d0c0671b> in <module>()
----> 1 s

NameError: name 's' is not defined

In [10]: c
Out[10]: 'Ich bin ein String'
Sowohl `s` als auch `c` verweisen auf dasselbe Objekt. Lösche ich `s`, so kann das Obejkt dahinter noch nicht gelöscht werden, da es über `c` noch gebunden ist.

Für das erste Beispiel gilt hingegen dieses:
Python Doku hat geschrieben: Deletion of attribute references, subscriptions and slicings is passed to the primary object involved; deletion of a slicing is in general equivalent to assignment of an empty slice of the right type (but even this is determined by the sliced object).
Nachzulesen hier: Link

`del` an sich ist schon zuverlässig - man muss nur wissen, was es tut. Objekte löscht es einfach nicht direkt; dafür ist der Garbage Collector von Python zuständig. Mit `del` kann man aber Bindings löschen und damit dem GC die Möglichkeit geben, ein Objekt zu löschen.

Wer explizite Speicherverwaltung wünscht, der ist in Python falsch! :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Dienstag 27. März 2012, 22:04

Danke an alle, das hat erstmal alle meine fragen beantwortet :-)
Achso und -> das ist nur ein reines testprog, ich will hier solange eine gruppe von buchstaben immer wieder neu zusammensetzen bist zufällig das wort rauskommt wie man es oben eingegeben hat.

Warum einfach wenns auch schwer geht? mehr wissen bedeutet, weniger wissen besser einzusetzen oder? ;-)
Benutzeravatar
snafu
User
Beiträge: 5925
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 27. März 2012, 22:30

Faerelis hat geschrieben:mehr wissen bedeutet, weniger wissen besser einzusetzen oder? ;-)
Wenn, dann geht es wohl eher darum, mit möglichst wenig Aufwand möglichst viel zu erreichen - Effektivität & Effizienz und sowas halt. Man setzt ja prinzipiell schon viel Wissen ein, nur resultiert das im Idealfall eben in deutlich weniger Codezeilen (bzw kompakterem Code). ;)
Antworten