Seite 1 von 2

Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Sonntag 25. März 2012, 06:49
von Faerelis
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.

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Sonntag 25. März 2012, 07:43
von BlackJack
@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.

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Sonntag 25. März 2012, 15:51
von problembär
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";
}

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Sonntag 25. März 2012, 16:41
von /me
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']

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Sonntag 25. März 2012, 19:43
von DasIch
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)

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Sonntag 25. März 2012, 21:59
von problembär
/me hat geschrieben:

Code: Alles auswählen

>>> a = 'Hallo'
>>> b = list(a)
>>> b
['H', 'a', 'l', 'l', 'o']
Ah, cool, danke dafür!

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 13:30
von Faerelis
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

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 14:20
von Faerelis
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

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 14:38
von EyDu
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.

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 14:54
von JonasR
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.

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 16:11
von jaessyfizzle
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.

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 19:57
von problembär
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.

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 20:28
von Hyperion
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! :-)

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 22:04
von Faerelis
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? ;-)

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 22:30
von snafu
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). ;)

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 23:00
von problembär
Faerelis hat geschrieben: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.
:lol:

Spoiler ;)

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 23:19
von EyDu
@problembär: Du machst es ein wenig umständlich um lediglich

Code: Alles auswählen

>>> import random
>>> a = list("Hallo")
>>> b = a[:]
>>> counter = 0
>>> while a != b:
...     counter += 1
...     random.shuffle(b)
... 
>>> print "%d Versuche" % counter
auszudrücken.

Sogar in C ist die Auswahl der Elemente mit deiner inneren while-Schleife schlecht, da für n Zeichen lediglich n Durchläufe benötigt werden. Du hast dir dort, wenn auch eine sehr unwahrscheinliche, mögliche Endlosschleife programmiert. Zur restlichen Codequalität muss man nicht viel sagen, es ist ja bekannt, dass du absichtlich gegen jegliche Idiome verstößt und das dann "Alternative" nennst.

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Dienstag 27. März 2012, 23:27
von Hyperion
@problembär: Es gibt ``random.shuffle``! Dein Ersatzkonstrukt ist... naja, eher weniger gelungen. Wenn man ``shuffle`` - wieso auch immer - nachbauen wollte, dann kann man sich den Umweg über das Raten von Zahlen sparen, sondern gefundene Elemente aus einer Initialmenge solange eleminieren, bis diese leer ist (``list.pop``). Damit spart man sich das zigfache Raten von Indizes, die gar nicht mehr benötigt werden.

Das Zusammensetzen ist auch mal wieder wenig gelungen. Anstelle von diesem Trum:

Code: Alles auswählen

    c = ""
    for i in b:
        c += a[i]
    print c
kann man das doch viel einfacher so schreiben:

Code: Alles auswählen

c = "".join(a[i] for i in b)
Höre doch endlich mal auf, Dich gegen ``join`` zu wehren. Speziell in diesem Falle liegen die Vorteile wohl auf der Hand!

Idiomatischer an sich wäre die folgende Lösung: Link

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Mittwoch 28. März 2012, 09:23
von BlackJack
Inspiriert von problembär's unpythonischer Lösung mit dem grauenhaften Shuffle-Code, hier mein unpythonischer Ansatz ((Free)Basic) mit einem Shuffle-Teil der eine deutlich vorhersehbarere Laufzeit hat:

Code: Alles auswählen

Dim As Integer i, j, wordLength, counter
Dim As String word, shuffled, tmp

Randomize

Line Input "Bitte ein Wort eingeben: ", word
wordLength = Len(word)
shuffled = word
counter = 0
Do
    counter = counter + 1
    For i=1 To wordLength
        j = Int(Rnd * wordLength) + 1
        tmp = Mid(shuffled, i, 1)
        Mid(shuffled, i, 1) = Mid(shuffled, j, 1)
        Mid(shuffled, j, 1) = tmp
    Next
    Print counter; " "; shuffled
Loop Until word = shuffled

Re: Buchstaben eines Wortes in eine Liste einlesen

Verfasst: Mittwoch 28. März 2012, 21:19
von problembär
EyDu hat geschrieben:

Code: Alles auswählen

>>> import random
>>> a = list("Hallo")
>>> b = a[:]
>>> counter = 0
>>> while a != b:
...     counter += 1
...     random.shuffle(b)
... 
>>> print "%d Versuche" % counter
Find' ich auch gut/besser so. Wenn die Aufgabe aber lautete
"Sortieren Sie eine Liste nach dem Zufall neu"
wäre 'random.shuffle()' eine Killer-Methode, durch die man die Aufgabe zwar löste, aber sich zugleich auch vor ihr drückte.
In der Praxis außerhalb von Aufgaben aber eine gute Sache: Man braucht ja nichts zu schreiben, was bereits mustergültig geschrieben ist (und man braucht auch das Rad nicht noch einmal zu erfinden). Klar.