Das ist eine sehr seltsame Art, Dinge zu organisieren. Wenn Sie in einem Wörterbuch gespeichert haben, ist dies einfach:
# This example should work in any version of Python.
# urls_d will contain URL keys, with counts as values, like: {'http://www.google.fr/' : 1 }
urls_d = {}
for url in list_of_urls:
if not url in urls_d:
urls_d[url] = 1
else:
urls_d[url] += 1
Dieser Code zum Aktualisieren eines Wörterbuchs der Zählungen ist ein allgemeines "Muster" in Python. Es ist so üblich, dass es eine spezielle Datenstruktur gibt defaultdict
, die erstellt wurde, um dies noch einfacher zu machen:
from collections import defaultdict # available in Python 2.5 and newer
urls_d = defaultdict(int)
for url in list_of_urls:
urls_d[url] += 1
Wenn Sie defaultdict
mit einem Schlüssel auf das zugreifen und der Schlüssel noch nicht in der vorhanden ist defaultdict
, wird der Schlüssel automatisch mit einem Standardwert hinzugefügt. Das defaultdict
nimmt das von Ihnen übergebene Callable und ruft es auf, um den Standardwert zu erhalten. In diesem Fall haben wir in der Klasse bestanden int
; Wenn Python aufruft int()
, wird ein Nullwert zurückgegeben. Wenn Sie also zum ersten Mal auf eine URL verweisen, wird deren Anzahl auf Null initialisiert, und dann fügen Sie der Anzahl eine hinzu.
Ein Wörterbuch voller Zählungen ist jedoch auch ein gängiges Muster. Daher bietet Python eine gebrauchsfertige Klasse: containers.Counter
Sie erstellen einfach eine Counter
Instanz, indem Sie die Klasse aufrufen und eine beliebige iterierbare Klasse übergeben. Es wird ein Wörterbuch erstellt, in dem die Schlüssel Werte aus der Iterable sind und die Werte angeben, wie oft der Schlüssel in der Iterable angezeigt wurde. Das obige Beispiel wird dann:
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
Wenn Sie es wirklich so machen müssen, wie Sie es gezeigt haben, ist es am einfachsten und schnellsten, eines dieser drei Beispiele zu verwenden und dann das zu erstellen, das Sie benötigen.
from collections import defaultdict # available in Python 2.5 and newer
urls_d = defaultdict(int)
for url in list_of_urls:
urls_d[url] += 1
urls = [{"url": key, "nbr": value} for key, value in urls_d.items()]
Wenn Sie Python 2.7 oder höher verwenden, können Sie dies in einem Einzeiler tun:
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]
Die Verwendung der Standardeinstellung funktioniert, aber auch:
Mit
.get
können Sie eine Standardrückgabe erhalten, wenn diese nicht vorhanden ist. Standardmäßig ist es Keine, aber in dem Fall, dass ich Sie gesendet habe, wäre es 0.quelle
Verwenden Sie defaultdict :
quelle
Das funktioniert bei mir immer gut:
quelle
Um es genau so zu machen wie du es willst? Sie können die for ... else-Struktur verwenden
Aber es ist ziemlich unelegant. Müssen Sie die besuchten URLs wirklich als LISTE speichern? Wenn Sie es als Diktat sortieren, das beispielsweise durch eine URL-Zeichenfolge indiziert ist, wäre es viel sauberer:
In diesem zweiten Beispiel sind einige Dinge zu beachten:
urls
die gesamteurls
Liste durchgehen müssen, wenn Sie nach einem einzigen testenurl
. Dieser Ansatz wird schneller sein.dict( )
anstelle von geschweiften Klammern verkürzt Ihren Codelist_of_urls
,urls
undurl
als Variablennamen der Code sehr schwer zu analysieren machen. Es ist besser , etwas klarer, wie zu findenurls_to_visit
,urls_already_visited
undcurrent_url
. Ich weiß, es ist länger. Aber es ist klarer.Und natürlich gehe ich davon aus, dass dies
dict(url='http://www.google.fr', nbr=1)
eine Vereinfachung Ihrer eigenen Datenstruktur ist, denn sonsturls
könnte es einfach sein:Was mit der Standardeinstellung sehr elegant werden kann :
quelle
Mit Ausnahme des ersten Males schlägt der Test der if-Anweisung jedes Mal fehl, wenn ein Wort angezeigt wird. Wenn Sie eine große Anzahl von Wörtern zählen, werden viele wahrscheinlich mehrmals vorkommen. In einer Situation, in der die Initialisierung eines Werts nur einmal erfolgt und die Erhöhung dieses Werts um ein Vielfaches erfolgt, ist es billiger, eine try-Anweisung zu verwenden:
Weitere Informationen hierzu finden Sie unter: https://wiki.python.org/moin/PythonSpeed/PerformanceTips
quelle