繁体   English   中英

Python - 从列表中选择随机对象

[英]Python - choosing random object from a list

我有对象列表“p”,每个对象都有一些数字“a”(例如p [3] .a = 5)。 我想从列表中选择随机对象,方式是选择一个对象的概率与其a值成正比,即选择a = 5的对象的概率是选择具有a = 1的对象的概率的五倍。 我怎么能用Python / Pylab / Numpy做到这一点?

谢谢!

这适用于整数计数,但对于大数量计数不会有效。

c = collections.Counter({k:k.a for k in stuff})
random.choice(list(c.elements()))

这是一种更有效的方法。

import random

def weighted_choice(items):
    # check if no items exist
    if not items:
        return None

    # compute total of all weights
    total = sum(item.weight for item in items)

    # select a random point within the total
    selection = random.randint(0, total - 1)

    # find the corresponding item
    count = 0
    for item in items:
        count += item.weight
        if selection < count:
            return item

我建议使用bisect

from bisect import bisect

class Element(object):
    def __init__(self, value):
        self.a = value
    def __repr__(self):
        return 'Element({})'.format(self.a)

data = [Element(3), Element(5), Element(7), Element(1)]
last = 0
breakpoints = []
for element in data:
    breakpoints.append(last + element.a)
    last += element.a
print(breakpoints)

for random_value in xrange(last):
    pos = bisect(breakpoints, random_value)
    print(random_value, data[pos])

您必须使用断点构建列表一次。 然后,只要您愿意,您就可以使用相当快速的bisect算法。

最后一个循环只是为了演示结果。

编辑:获取断点的另一种方法(我不喜欢for-loop):

values = [value.a for value in data]
breakpoints = [sum(values[:pos+1]) for pos in xrange(len(values))]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM