How can I get a weighted random pick from Python's Counter class?

前端 未结 6 1635
天命终不由人
天命终不由人 2021-02-07 08:16

I have a program where I\'m keeping track of the success of various things using collections.Counter — each success of a thing increments the corr

6条回答
  •  刺人心
    刺人心 (楼主)
    2021-02-07 08:56

    Given a dictionary of choices with corresponding relative probabilities (can be the count in your case), you can use the new random.choices added in Python 3.6 like so:

    import random
    
    my_dict = {
        "choice a" : 1, # will in this case be chosen 1/3 of the time
        "choice b" : 2, # will in this case be chosen 2/3 of the time
    }
    
    choice = random.choices(*zip(*my_dict.items()))[0]
    

    For your code that uses Counter, you can do the same thing, because Counter also has the items() getter.

    import collections
    import random
    
    my_dict = collections.Counter(a=1, b=2, c=3)
    choice = random.choices(*zip(*my_dict.items()))[0]
    

    Explanation: my_dict.items() is [('a', 1), ('b', 2), ('c', 3)].
    So zip(*my_dict.items()) is [('a', 'b', 'c'), (1, 2, 3)].
    And random.choices(('a', 'b', 'c'), (1, 2, 3)) is exactly what you want.

提交回复
热议问题