Seite 1 von 1

zufälliges schlüssel/wert-paar aus dict ausgeben

Verfasst: Donnerstag 4. September 2008, 22:17
von gehirn
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

Verfasst: Donnerstag 4. September 2008, 22:27
von yipyip
Spontan faellt mir da

Code: Alles auswählen

random.choice(my_dict.items())
ein.

:wink:
yipyip

Re: zufälliges schlüssel/wert-paar aus dict ausgeben

Verfasst: Freitag 5. September 2008, 09:08
von EyDu
gehirn hat geschrieben:also popitem() erfüllt den zweck nicht.
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.

Verfasst: Freitag 5. September 2008, 18:18
von gehirn
@yipyip: ist dein vorschlag bei großen dicts nicht zu langsam? es wir ja jedesmal das ganze dingen kopiert.

Verfasst: Freitag 5. September 2008, 18:42
von BlackJack
Es kommt darauf an was "zu langsam" im konkreten Fall bedeutet.

Verfasst: Freitag 5. September 2008, 18:55
von gehirn
ob es keine schnellere methode gibt, soll das bedeuten.

Verfasst: Freitag 5. September 2008, 19:18
von BlackJack
Eventuell:

Code: Alles auswählen

key = random.choice(dictionary.keys())
value = dictionary[key]
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.

Verfasst: Freitag 5. September 2008, 20:20
von Leonidas
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.

Verfasst: Freitag 5. September 2008, 20:37
von abgdf
Wie wär's:

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ß

Verfasst: Freitag 5. September 2008, 22:51
von yipyip
Wusste mal wieder nicht, dass es um pure Geschwindigkeit geht.

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
ergibt:
0.0767362117767
0.0145328044891
1.34616398811
Der Sieger ist: BlackJack !

:wink:
yipyip

Verfasst: Samstag 6. September 2008, 17:31
von epsilon
@ 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.

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
an das Skript von yipyip dran gehängt ergibt

0.0918290615082
0.0164000988007
1.32954907417
0.00253510475159