tuples or list umgekehrt indizieren und andere fragen

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.
Antworten
Ryan
User
Beiträge: 2
Registriert: Donnerstag 28. Mai 2009, 13:44

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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`
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@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)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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).
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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]))]
Ryan
User
Beiträge: 2
Registriert: Donnerstag 28. Mai 2009, 13:44

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
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]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Oder:

Code: Alles auswählen

from string import ascii_lowercase as lowercase_letters
assert set(word).issubset(lowercase_letters)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten