random choice from dictionary

Ben Bacarisse ben.usenet at bsb.me.uk
Sun Dec 23 22:09:14 EST 2018


"Avi Gross" <avigross at verizon.net> writes:
<snip>
> The following is a function that iterates over the dictionary one key at a
> time and when it reaches a random one, it returns the key without further
> evaluation. On the average, it takes N/2 iterations for N keys. Asking to
> make a list(data) may be efficient in terms of time and indexing is fast but
> space is used maximally unless it just points to existing storage.
>
> Here is one way to do the function. Some might use an emum instead.
>
> def rand_key(data):
>     """Get a random key from a dict without using all of memory."""
>     import random        
>     randy = random.randrange(len(data))
>     this = 0
>     for key in data:
>         if (this == randy):
>             return(key)
>         this += 1

There is beautiful variation on this that can select k random keys:

def sample_keys(data, k = 1):
    """Return k random keys from a dict."""
    import random
    items = len(data)
    keys = []
    for key in data:
        r = random.random()
        if r < k/items:
            keys.append(key)
            k -= 1
        items -= 1
    return keys

And there is a variation on /that/ will use fewer random numbers --
essentially picking a number of "skip" distances as you pick one.  But
it's late, and I need to get ready to eat lots...

<snip>
-- 
Ben.


More information about the Python-list mailing list