python - set_title - matplotlib title position



Python: Liste des Diktats, wenn vorhanden, inkrementiere einen Diktatwert, wenn nicht ein neues Diktat angehängt (4)

Außer beim ersten Mal versagt jedes Mal, wenn ein Wort angezeigt wird, der Test der if-Anweisung. Wenn Sie eine große Anzahl von Wörtern zählen, werden viele wahrscheinlich mehrmals vorkommen. In einer Situation, in der die Initialisierung eines Wertes nur einmal erfolgt und die Erhöhung dieses Wertes viele Male auftritt, ist es günstiger, eine try-Anweisung zu verwenden:

urls_d = {}
for url in list_of_urls:
    try:
        urls_d[url] += 1
    except KeyError:
        urls_d[url] = 1

Sie können mehr darüber lesen: https://wiki.python.org/moin/PythonSpeed/PerformanceTips

Ich möchte so etwas machen.

list_of_urls = ['http://www.google.fr/', 'http://www.google.fr/', 
                'http://www.google.cn/', 'http://www.google.com/', 
                'http://www.google.fr/', 'http://www.google.fr/', 
                'http://www.google.fr/', 'http://www.google.com/', 
                'http://www.google.fr/', 'http://www.google.com/', 
                'http://www.google.cn/']

urls = [{'url': 'http://www.google.fr/', 'nbr': 1}]

for url in list_of_urls:
    if url in [f['url'] for f in urls]:
         urls[??]['nbr'] += 1
    else:
         urls.append({'url': url, 'nbr': 1})

Wie kann ich ? Ich weiß nicht, ob ich das Tupel nehmen sollte, um es zu bearbeiten oder das Tupel-Indice herauszufinden.

Irgendeine Hilfe ?


Answer #1

Benutze defaultdict :

from collections import defaultdict

urls = defaultdict(int)

for url in list_of_urls:
    urls[url] += 1

Answer #2

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örterverzeichnisses von Zählungen ist ein allgemeines "Muster" in Python. Es ist so üblich, dass eine spezielle Datenstruktur, defaultdict , erstellt wird, 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 mit einem Schlüssel auf das defaultdict zugreifen und der Schlüssel nicht bereits im defaultdict , wird dem Schlüssel automatisch ein Standardwert hinzugefügt. Das defaultdict nimmt die defaultdict die Sie übergeben haben, und ruft sie auf, um den Standardwert zu erhalten. In diesem Fall haben wir in der Klasse int ; Wenn Python int() aufruft, gibt es einen Nullwert zurück. Wenn Sie also zum ersten Mal auf eine URL verweisen, wird deren Anzahl auf Null initialisiert und Sie fügen dann eins zur Anzahl hinzu.

Aber ein Wörterbuch voller Zählimpulse ist auch ein allgemeines Muster, also stellt Python eine gebrauchsfertige Klasse zur Verfügung: containers.Counter Sie verursachen gerade eine Gegeninstanz, indem Sie die Klasse aufrufen und irgendeine iterable übergeben; Es erstellt ein Dictionary, in dem die Schlüssel Werte aus dem iterablen Wert sind, und die Werte sind die Anzahl der Male, die der Schlüssel im iterablen Fall 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, wäre der einfachste und schnellste Weg, eines dieser drei Beispiele zu verwenden und dann das zu bauen, das Sie brauchen.

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 neuer 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()]

Answer #3

Mit den Standard funktioniert, aber auch so:

urls[url] = urls.get(url, 0) + 1

.get Sie .get , können Sie eine Standardrückgabe erhalten, wenn sie nicht existiert. Standardmäßig ist es Keine, aber in dem Fall, dass ich Ihnen geschickt habe, wäre es 0.





tuples