PHP-Code in Python

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.
BlackJack

Beitragvon BlackJack » Samstag 27. August 2005, 21:36

Ich weiss auch nicht so recht was Du mit sortierten Dictionaries genau machen willst. Wenn Du nach Schlüssel sortiert die Schlüssel und Werte ausgeben oder sonstwie bearbeiten willst, dann kannst Du das z.B. so machen:

Code: Alles auswählen

for key, value in sorted(dictionary.items()):
    print key, value


Zu der Dokumentationsfrage: Die Doku von Python beschreibt eigentlich alle Module die mitgeliefert werden. Beispiele sind nicht überall vorhanden, aber man kann auch im Interaktiven Interpreter mal schnell was ausprobieren wenn man sich nicht ganz sicher ist.

Das ``and`` statt ``&&`` finde ich etwas lesbarer, weil das Wort `and` eine bekannte Bedeutung hat, während ``&&`` nicht ganz so selbsterklärend ist.
gree
User
Beiträge: 9
Registriert: Samstag 27. August 2005, 16:56
Kontaktdaten:

Beitragvon gree » Sonntag 28. August 2005, 13:47

And:
In PHP geht, soweit ich weiß, beides.

Dictionarys:
Ich würde gerne nach den Werten sortieren, das hab ich jetzt so genacht:

Code: Alles auswählen

while len(array) > 0:
    biggest = array.keys()[0]
    for k in array:
        if array[k] > array[biggest]:
            biggest = k
    print "Letter: %s" %biggest, "- Anz: %i" %array[biggest], "%"
    del array[biggest]


array ist mein dictionary, in dem jedem Buchstaben von 'a' bis 'z' die Anzahl seines Auftretens im Text zugeordnet ist.
Funzt jetzt auch.
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Sonntag 28. August 2005, 15:56

Schau dir nochmal das Beispiel von Blackjack an, das ganze geht viel einfacher:

Code: Alles auswählen

l = array.items()
l.sort()
for buchstabe, anzahl in l:
    print "Letter",buchstabe,"Anzahl",anzahl
    # oder print "Letter %s - Anzahl %i" % (buchstabe,anzahl)
Auf sorted hab ich verzichtet, da es erst bei Python 2.4 dabei ist.

Edit: Ah, du willst nach der Anzahl (also dem zweiten Element in dem Tupel (key,value)) sortieren. In diesem Falle l.sort() durch folgendes ersetzen:

Code: Alles auswählen

l.sort(lambda a,b:cmp(a[1],b[1]))
Wenn du mit dem größten Wert anfangen willst, kannst du
  1. nach dem sort ein l.reverse() ausführen, oder
  2. statt cmp schreiben: -cmp
BlackJack

Beitragvon BlackJack » Sonntag 28. August 2005, 22:55

Oder den `reverse` Parameter benutzen:

Code: Alles auswählen

from operator import itemgetter

histogram = {'a': 10, 'b': 5, 'c': 100}

for item in sorted(histogram.items(), key=itemgetter(1), reverse=True):
    print 'Letter %r - count: %d' % item
gree
User
Beiträge: 9
Registriert: Samstag 27. August 2005, 16:56
Kontaktdaten:

Beitragvon gree » Montag 29. August 2005, 16:14

Danke!
Das Beispiel oben hab ich schonmal gesehen, konnte aber mir nichterklähren, was dieses lambda a,b:cmp(a[1],b[1]) zu bedeuten hat, das sort() übergeben wird... Ich werds mal ausprobieren, aber was bedeutet das? Lambda ist doch ein Buchstabe.
Ich benutze ungern Dinge, die ich nicht verstehe, ne, andersrum: Ich verstehe gerne Dinge, die ich benutze.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 29. August 2005, 16:37

Also ich programmiere jetzt schon länger Python, weiß allerdings auch nicht alles... Mit lambda umgehen kann ich auch nicht und ich glaube das muß man auch nicht unbedingt... Es gibt auch andere Möglichkeiten... Außerdem soll doch lambda auch irgendwann abgeschafft werden:

http://www.python.org/peps/pep-3000.html

http://www.python-forum.de/viewtopic.php?t=3875
http://www.python-forum.de/viewtopic.php?t=3455

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Montag 29. August 2005, 16:52

Erstmal ack, lambda ist beknntermaßen unschön und hoffentlich bald nicht mehr Teil von Python.

Ums nochmal kurz zu erklären:

Code: Alles auswählen

funk = lambda a, b: a*2 + b


ist dasselbe wie:

Code: Alles auswählen

def funk(a, b):
  return a*2 + b


Mit dem Unterschied, dass die Funktion, wenn man sie mit Lambda definiert keinen Namen kriegen muss (wird gern da verwendet, wo man eine kleine Funktion als Paramter übergeben will, z.B. bei sort oder map)

Lambda ist aber auch recht beschränkt: Man kann keine zweite "Zeile" in die Funktion einbauen, das gibt die Syntax schon nicht her,
lambdas dürfen halt nur "Expressions" beinhalten.

pydoc lambda hat geschrieben:Lambda forms (lambda expressions) have the same syntactic position as expressions. They are a shorthand to create anonymous functions; the expression lambda arguments: expression yields a function object.

[/quote]
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 29. August 2005, 16:57

Aha, nun hab auch ich es verstanden ;)

Also in dem Falle würde ich mir einfach eine Funktion in einer Funktion machen:

Code: Alles auswählen

def meineFunktion( x, y ):
    def funk(a, b):
        return a*2 + b
   
    print funk( x, y )


Ist zwar nicht so verbreitet, aber ich find's einleuchtend...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Montag 29. August 2005, 17:08

jens hat geschrieben:Also in dem Falle würde ich mir einfach eine Funktion in einer Funktion machen


Ich normalerweise auch, weil es an sich besser lesbar ist,
(ich schätze mal, darum soll lambda auch abgeschafft werden)
aber ich persönlich nutze doch noch manchmal lambda für die ganz kurzen Dinger...
BlackJack

Beitragvon BlackJack » Dienstag 30. August 2005, 00:50

lambda soll wohl hauptsächlich abgeschafft werden, weil es in Python so eingeschränkt ist. In anderen Sprachen hat man bei anonymen Funktionen den vollen Sprachumfang zur Verfügung und nicht nur eine Untermenge.
gree
User
Beiträge: 9
Registriert: Samstag 27. August 2005, 16:56
Kontaktdaten:

Beitragvon gree » Dienstag 30. August 2005, 16:11

Danke, aber wieso heißt diese eigenartige Funktion gerade lambda, und was bewirkt die, wenn ihr ergebnis übergeben wird...?
BlackJack

Beitragvon BlackJack » Dienstag 30. August 2005, 22:17

Der Name geht auf das [url=http://de.wikipedia.org/wiki/Lambda-Kalkül]Lambda-Kalkül[/url] zurück. Ein paar funktionale Programmiersprachen basieren auf der getypten Variante wie z.B. Haskell. Da wird das Lambda mit '\' abgekürzt, aber es gibt auch Programmiersprachen wo ebenfalls das Schlüsselwort `lambda` benutzt wird, z.B. in Scheme.

Den zweiten Teil der Frage habe ich nicht verstanden!?
gree
User
Beiträge: 9
Registriert: Samstag 27. August 2005, 16:56
Kontaktdaten:

Beitragvon gree » Donnerstag 1. September 2005, 18:47

Danke, zweiter Teil:
sorted(lambda a,b:cmp(a[1],b[1]))
Was macht diese Funktion mit den eigenartigen ihr übergebenen Werten, und was bedeuten die (was lambda macht hab ich jetzt verstanden, aber was das bringt...)
BlackJack

Beitragvon BlackJack » Donnerstag 1. September 2005, 21:43

Um sortieren zu können muss man Elemente miteinander vergleichen, damit man weiss welche weiter vorne in die Liste gehören und welche weiter hinten. Wenn man nur `list.sort()` oder `sorted(liste)` benutzt, dann werden die Elemente vom Sortieralgorithmus einfach mit '<' oder '>' verglichen.

Bei den Tupeln (Buchstabe, Anzahl) aus Deinem Beispiel würde erst nach Buchstabe und dann nach Anzahl verglichen. Da die Buchstaben alle unterschiedlich sind, weil sie Schlüssel eines Dictionaries sind, wird effektiv nur nach Buchstaben sortiert. Das ist bei dem Tupel das 0-te Element. Du wolltest aber nach der Anzahl, also dem 1-ten Element des Tupels sortieren. Und dazu kannst Du eine Funktion angeben die genau das tut: zwei Objekte entgegennehmen und das Element an Index 1 miteineinder vergleichen.

Oder man kann den `key`-Parameter übergeben, der eine Funktion sein muss, die aus einem Element einen Schlüssel zum Vergleichen "errechnet". Das habe ich in meinem Beispiel mit der `itemgetter()` Funktion gemacht. Das ist letztendlich Geschmackssache.

Code: Alles auswählen

In [20]: a = [('b', 200), ('z', 42), ('a', 100), ('b', 10)]

In [21]: sorted(a)
Out[21]: [('a', 100), ('b', 10), ('b', 200), ('z', 42)]

In [22]: sorted(a, lambda x, y: cmp(x[1], y[1]))
Out[22]: [('b', 10), ('z', 42), ('a', 100), ('b', 200)]

In [23]: import operator

In [24]: sorted(a, key=operator.itemgetter(1))
Out[24]: [('b', 10), ('z', 42), ('a', 100), ('b', 200)]

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]