Python: for-Schleife in der index-Zuordnung
Während der Arbeit durch das Super Buch "Programming Collective Intelligence" von Toby Segaran, ich habe festgestellt, einige Techniken in der index-Zuordnungen, ich bin nicht ganz vertraut mit.
Nehmen Sie dies zum Beispiel:
createkey='_'.join(sorted([str(wi) for wi in wordids]))
oder:
normalizedscores = dict([(u,float(l)/maxscore) for (u,l) in linkscores.items()])
Alle geschachtelten Tupel von Indizes, die mich ein bisschen verwirrt haben. Was ist eigentlich zugewiesen wird, werden diese Variablen? Ich nahm natürlich die .join
kommt man sich wie ein string, aber was ist mit letzterem? Wenn jemand könnte erklären, die mechanik der Schlaufen würde ich es wirklich schätzen. Ich nehme an, das sind ziemlich Allgemeine Techniken, aber wird neu in Python, ich nehme an, zu Fragen, ist ein moment der Scham. Danke!
float(l)
Nehme ich an...- rechts mein schlecht - bearbeitet
- Jeder ist zu erwähnen, dass diese Liste Verstehens. Was die Leute nicht zu erwähnen, ist, dass diese Beispiele falsch sind und dass diejenigen, die eckigen Klammern sollten weggelassen werden-Sie werden sollte, generator-Ausdrücke statt, das sind die selben, außer Sie liefert nur Werte wie nötig, anstatt speichert Sie alle in einer Liste. Da bist du nur mit den Listen sofort, dann werfen Sie Sie Weg, Sie wären besser dran, nur mit generator-Ausdrücke.
- könnten Sie ein Beispiel geben? Ich bin neu in diesem Ansatz. Danke!
- Ersetzen Sie einfach die eckigen Klammern mit den Klammern, und die
sorted
unddict
- Funktionen fragt nach einem Wert in einer Zeit, die der generator-Ausdruck geben, statt speichern Sie Sie alle in eine temporäre Liste. - Nicht
sorted()
erstellen Sie eine Liste überhaupt? - Ich habe gerade timed, und
sorted()
dauert ungefähr 10 % länger auf einen generator-Ausdruck als eine Liste. - Aber mit einer list comprehension die Liste hat zu existieren zweimal, statt einmal. Welche version ist das auf? Liste Verstehens sind im Grunde
list()
um einen generator-Ausdruck auf Python 3.2+ (?) aber ich wäre nicht überrascht, ein Unterschied von 10% in früheren Versionen. - Nein, es muss nicht doppelt vorhanden. Es ist gebaut, während die Liste Verständnis und als parameter übergeben zu
sorted()
(was dann wieder eine neue Liste). Mit genex,sorted()
zunächst erstellen Sie eine Liste aus dem genex' Ergebnisse, und dann eine Liste erstellen, die es gibt. Ich hatte zeitlich das auf Python-3.2.2 wo der Effekt stärker ausgeprägt ist als an Python 2.7.2 (ich habe die timings meiner neu bearbeitete Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
ist ein list comprehension.
ist das gleiche wie
So
erstellt eine Liste von strings, die aus jedem Element im
wordids
, sortiert dann die Liste und schließt Sie in einen großen string mit_
als Trennzeichen.Als agf hat zu Recht bemerkt, können Sie auch einen generator, der Ausdruck, die sieht aus wie eine Liste Verständnis, aber mit Klammern anstelle von eckigen Klammern. Dies vermeidet den Bau einer Liste, wenn Sie brauchen es nicht höher (außer für die Iteration über es). Und wenn Sie bereits haben, die Klammern wie in diesem Fall mit
sorted(...)
können Sie einfach entfernen Sie die Klammern.Jedoch in diesem speziellen Fall, Sie werden nicht immer zu einer höheren Leistung (in der Tat, es wird etwa 10 % langsamer; ich zeitlich es), weil
sorted()
benötigen zur Erstellung einer Liste sowieso, aber es sieht ein bisschen schöner:iteriert durch die Elemente des dictionary
linkscores
, wo jedes Element ein Schlüssel/Wert-paar. Es erstellt eine Liste von Schlüssel/l/maxscore
Tupel und dreht sich dann, dass die Liste wieder in ein Wörterbuch.Jedoch, da Python 2.7, können Sie auch dict Verstehens:
Hier einige timing-Daten:
Python 3.2.2
Python 2.7.2
Nehmen wir das erste:
str(wi) for wi in wordids
nimmt jedes element inwordids
und konvertiert Sie zu einem string.sorted(...)
sortiert (lexikografisch).'_'.join(...)
führt die sortierten word-ids zu einer einzelnen Zeichenfolge mit einem Unterstrich zwischen den Einträgen.Nun das zweite:
linkscores
ist ein Wörterbuch (oder ein dictionary-ähnliches Objekt).for (u,l) in linkscores.items()
iteriert über alle Einträge im Wörterbuch, für jeden Eintrag die Zuordnung der Schlüssel und der Wertu
undl
.(u,float(1)/maxscore)
ist ein Tupel, das erste element istu
und das zweite element ist1/maxscore
(für mich sieht es aus wie könnte es ein Tippfehler:float(l)/maxscore
würde mehr Sinn machen, -- Hinweis: der Kleinbuchstabe el anstelle von einem).dict(...)
Konstrukte ein Wörterbuch aus der Liste von Tupeln, wobei das erste element jedes Tupels wird als Schlüssel und der zweite ist der Wert.Kurz, es macht eine Kopie des Wörterbuchs, die Erhaltung der Tasten und die Division jedes Wertes durch
maxscore
.Letzteres ist äquivalent zu:
Dieser erstellt eine Liste, die von der Iteration über Tupel in
linkscores.items()
- und computing -(u, float(l)/maxscore)
für jedes Tupel.schafft eine
dict
mit Einträgen aus dem Ergebnis der list-comprehension -(u, float(l)/maxscore)
für jedes Element inlinkscores
.Als weiteres Beispiel für die Schaffung eines dict-aus einer Liste von Tupeln:
Hier ist ein Beispiel für die erste...Beispiel
Was es tut, ist, Durchlaufen Sie die Liste mit einer for-Schleife, Sortierung der Liste, verbindet dann alle die sortierten Werte in eine Zeichenfolge, die Trennung der Werte mit '_'
Den seltsam aussehenden Geschäft passiert im inneren des
[]
Klammern genannt wird eine Liste Verständnis, und es ist im Grunde eine wirklich prägnante Weise bauen Sie eine Liste.myList = [str(wi) for wi in wordids]
ist äquivalent zu:sorted()
sortiert dann die Liste, undjoin()
gibt eine Zeichenfolge mit jener Liste, die Elemente, getrennt durch Unterstriche, wie diese:item1_item2_item3_...
.Die zweite Aufgabe ist komplizierter/knappe, aber hier ist was Los:
linkscores
sieht aus wie ein Wörterbuch, und dieitems()
Methode gibt eine Liste von(key, value)
Tupel aus dem Wörterbuch. Sofor (u,l) in linkscores.items()
ist die Schleife über die Liste.(u, float(l)/maxscore)
, und fügen Sie es der Liste. Also ist dieser Schritt im Grunde ändert sich Ihre(item, value)
Liste, um eine Liste der(item, normalized value)
Tupel.dict()
Funktion schaltet zurück in ein Wörterbuch.Insgesamt ist das Ergebnis der zu nehmen ist, alle Werte in dem dict und zu normalisieren. Es kann ein einfacher/Ausführlicher Weise, dies zu tun, aber dieser Weg hat den Vorteil, cool Aussehen lassen. Ich ziehe es nicht tun verrückte Sachen mit Liste Verstehens, weil es weh tut, Lesbarkeit, so fühlen sich nicht schlecht wenn Sie nicht gerne schreiben, diese Art der Sache selbst!