Seite 1 von 1

tuples or list umgekehrt indizieren und andere fragen

Verfasst: Donnerstag 28. Mai 2009, 14:09
von Ryan
Hi habe seit neustem angefangen mit python und 3 fragen:
1. Frage ich möchte ne liste umgekehrt indizieren,
also wenn ich list[4] eingebe kommt 'e' raus.
aber wie bringe ich es hin, dass ich vom Element 'e' ausgehe und die indexnummer 4 rauskommt.
ich könnte eine dic machen mit den buchstaben als keys und den zahlen als werten, ist aber sehr unschön...
list = ('a','b','c','d','e','f')

2. wie kann ich dinge graphisch umsetzen??
im Java gabs doch so befehle wie drawCircle usw....

3. wie lauten befehle zum auf andere dateien zuzugreifen? also wenn ich z.B. für alle interpreten nen ordner erstellt haben möchte und alle musikdateien sollten auch automatisch in den richtigen ordner wechseln.

Verfasst: Donnerstag 28. Mai 2009, 14:20
von cofi
Zu 1: `list` ist ein richtig mieser Name, sollte man nicht verwenden, da es das `list`-Built-in überschreibt. Für dein Problem gibt es `list.index()`

Zu 2: Nun da musst du dich eben mit den GUI-Toolkits auseinandersetzen, Tk (als Tkinter) ist von Haus aus dabei.

Zu 3: Schau dir die Module os, os.path, und shutil an.
Konkret sind das die Funktionen `os.mkdir`, `shutil.move`

Verfasst: Donnerstag 28. Mai 2009, 15:46
von BlackJack
@Ryan: Zu 1. `list` verdeckt nicht nur den eingebauten Typ mit dem Namen, sondern ist auch noch ziemlich irreführend, wenn man wie im Beispiel ein Tupel statt einer Liste an den Namen bindet. Namen sollten nicht den Typ reflektieren, sondern die Bedeutung des Objekts beschreiben.

Die Lösung mit dem Dictionary ist nicht unschön, sondern die naheliegendste Lösung. `list.index()` skaliert nicht besonders gut von der Laufzeit her, weil da linear in der Liste gesucht wird. Ausserdem muss man aufpassen, dass eine Umkehr von Index->Element zu Element->Index nicht eindeutig sein muss. Es kann zu einem Element auch mehrere Indizes geben.

Verfasst: Donnerstag 28. Mai 2009, 16:20
von Hyperion
@2: Wenn es Dir um rein grafische Sachen geht, dann wäre ggf. auch PIL oder xturtle etwas für Dich. Damit kannst Du Bilder manipulieren und auch erstellen. (drawCircle() klang jetzt eher danach)

Verfasst: Donnerstag 28. Mai 2009, 16:50
von numerix
Hyperion hat geschrieben:@2: Wenn es Dir um rein grafische Sachen geht, dann wäre ggf. auch PIL oder xturtle etwas für Dich. Damit kannst Du Bilder manipulieren und auch erstellen. (drawCircle() klang jetzt eher danach)
xturtle ist tot. Ist ab Py 2.6 im turtle-Modul aufgegangen (d.h. das turtle-Modul kann jetzt all das, was vorher nur mit xturtle möglich war).

Verfasst: Donnerstag 28. Mai 2009, 18:00
von derdon
Vielleicht hilft dir das für 1. weiter:

Code: Alles auswählen

>>> from collections import defaultdict
>>> from pprint import pprint
>>> d = defaultdict(set)
>>> s = 'mississippi'
>>> for index, char in enumerate(s):
...     d[char].add(index)
... 
>>> pprint(d.items())
[('i', set([1, 10, 4, 7])),
 ('p', set([8, 9])),
 ('s', set([2, 3, 5, 6])),
 ('m', set([0]))]

Verfasst: Freitag 29. Mai 2009, 00:02
von Ryan
danke, für die vielen und schnellen atworten. :D
hab mich jetzt mal nur mit den Antworten zu frage 1 auseinandergesetzt...(ist ja auch schon ein bissl spät jetz)
den rest schau ich mir später an...
@einige: list als name ist nur ein beispiel....ich benutzte aber oft auch einfach buchstaben als variablen

@derdon: jep das hilft wobei ichs ein bissl anders gemacht habe...
(der sinn der sache soll ne buchstabenverschiebung sein eines wortes, die funktion ist teil der class 'st'; 'wll' verwandelt einen string in ne liste aus den einzelnen buchstaben)
hier ist meine momentane Lösung:

Code: Alles auswählen

    def ld(self, x): #LetterDifferating  #Buchstaben verschieben
        b5 = st.wll(self)
        letterworth = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
        letterdict = {}
        for index, buchst in enumerate(letterworth):
            letterdict[buchst] = index
        y = []
        
        for i5 in b5:
            z = letterdict[i5]+x
            while z > 25:
                z = z-26
            y.append (letterworth[z])
        return y

Verfasst: Freitag 29. Mai 2009, 01:43
von BlackJack
@Ryan: Das sieht ziemlich umständlich aus, und die Namensgebung ist ja ziemlich abenteuerlich. `ld`, `st`, `wll`, `i5`, `b5`? Wer soll denn das verstehen!? Solche Namen waren bei BASIC auf alten Heimcomputern üblich, weil die Implementierungen entweder keine längeren Namen erlaubten, oder man unbedingt jedes Byte sparen musste. Aber die Zeiten sind ja $GOTT sei Dank vorbei. Wenn man einen Kommentar an einer Definition braucht, der die Abkürzung ausgeschrieben enthält, hat man etwas falsch gemacht. Auch bei `buchst` hätte es Dich nicht umgebracht `buchstuetze` auch auszuschreiben. Wirklich kurze Namen sind IMHO eigentlich nur bei rein mathematischen Geschichten, den üblichen Zählvariablen, und in "list comprehensions", und Generator-Ausdrücken eine gute Idee. Wobei es Zählvariablen in Python recht selten gibt.

Der Aufruf von `wll` ist falsch, der muss ``self.wll()`` lauten. Sonst verhält sich `ld` bei abgeleiteten Klassen, bei denen `wll` überschrieben wurde, "komisch".

Ich habe so das Gefühl, dass Du eigentlich eine Funktion haben wolltest, die ungefähr so aussieht:

Code: Alles auswählen

ALPHABET_LENGTH = 26
VALUE_OF_A = ord('a')

def rotated(offset, word):
    assert all('a' <= c <= 'z' for c in word)
    return [(ord(c) - VALUE_OF_A + offset) % ALPHABET_LENGTH for c in word]

Verfasst: Freitag 29. Mai 2009, 15:59
von derdon
Man kann sich drüber streiten, was man besser findet, aber ich finde

Code: Alles auswählen

from string import ascii_lowercase as lowercase_letters
assert all(c in lowercase_letters for c in word)
leserlicher.

Verfasst: Samstag 30. Mai 2009, 12:02
von birkenfeld
Oder:

Code: Alles auswählen

from string import ascii_lowercase as lowercase_letters
assert set(word).issubset(lowercase_letters)