nabend
ich versuche gerade, ein zufälliges schlüssel/wert- paar eines dicts auszugeben, ohne dass es danach entfernt wird, also popitem() erfüllt den zweck nicht.
danke für eure ideen.
gehirn
zufälliges schlüssel/wert-paar aus dict ausgeben
Auch wenn du das Element entfernen wolltest, würde es deinen Anforderungen nicht entsprechen. "popitem" nimmt ein *beliebiges* Element aus dem Dictionary aber kein zufälliges.gehirn hat geschrieben:also popitem() erfüllt den zweck nicht.
Eventuell:
Kann aber auch langsamer sein, weil mehr Python-Bytecodes ausgeführt werden.
Letztendlich ist ein Dictionary halt für so einen Zugriff nicht geeignet, wenn's effizient sein soll.
Aber wie gesagt: Es kommt auf den konkreten Einsatz an, ob's *zu* langsam ist.
Code: Alles auswählen
key = random.choice(dictionary.keys())
value = dictionary[key]
Letztendlich ist ein Dictionary halt für so einen Zugriff nicht geeignet, wenn's effizient sein soll.
Aber wie gesagt: Es kommt auf den konkreten Einsatz an, ob's *zu* langsam ist.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Python 3.0 hat da den Vorteil dass keys() und items() Dictionary-Views sind und nicht immer neue Listen, was der Performance und dem geringerem Speicherverbrauch zuträglich ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Wie wär's:
?
Gruß
Code: Alles auswählen
import random
a = {"a" : "1", "b" :"2", "c": "3"}
b = a.keys()
random.shuffle(b)
for i in b:
print a[i]
Gruß
Wusste mal wieder nicht, dass es um pure Geschwindigkeit geht.
Ein kleines Rennen:
ergibt:
yipyip
Ein kleines Rennen:
Code: Alles auswählen
import time
import random
n = 1000
m = 1000
d = dict(zip(xrange(n), xrange(n)))
start = time.time()
for i in xrange(m):
v = random.choice(d.items())
print time.time() - start
start = time.time()
for i in xrange(m):
c = random.choice(d.keys())
v = d[c]
print time.time() - start
start = time.time()
for i in xrange(m):
k = d.keys()
random.shuffle(k)
v = d[k[0]]
print time.time() - start
Der Sieger ist: BlackJack !0.0767362117767
0.0145328044891
1.34616398811
yipyip
@ gehirn:
musst du überhaupt per key auf die Werte im dict zugreifen?
Ansonsten würde ich eher eine Liste aus tuples verwenden, wenn es dir auf Performance ankommt.
an das Skript von yipyip dran gehängt ergibt
0.0918290615082
0.0164000988007
1.32954907417
0.00253510475159
musst du überhaupt per key auf die Werte im dict zugreifen?
Ansonsten würde ich eher eine Liste aus tuples verwenden, wenn es dir auf Performance ankommt.
Code: Alles auswählen
l = zip(xrange(n), xrange(n))
start = time.time()
for i in xrange(m):
v = random.choice(l)[1]
print time.time() - start
0.0918290615082
0.0164000988007
1.32954907417
0.00253510475159