多次运行随机算法并对结果取平均值

问题描述 投票:0回答:3

我有以下随机选择脚本:

import random

length_of_list = 200
my_list = list(range(length_of_list))
num_selections = 10

numbers = random.sample(my_list, num_selections)

它查看预定大小的列表并随机选择10个数字。有没有办法运行这个部分500次,然后获得最多被选中的前10个数字?我想我可以将数字输入字典然后从那里获得前10个数字。到目前为止,我已经完成了以下工作:

for run in range(0, 500):
    numbers = random.sample(my_list, num_selections)
    for number in numbers:
        current_number = my_dict.get(number)
        key_number = number
        my_dict.update(number = number+1)

    print(my_dict)

在这里,我希望代码获取分配给该密钥的当前编号,然后添加1,但我无法使其工作。似乎字典更新的关键必须是那个特定的键,不能插入一个变量..而且,我认为这个嵌套循环可能不是那么高效,因为我必须运行500次1500次23 ...所以我担心表现。如果有人知道我应该尝试什么,那就太好了!谢谢

解:

import random
from collections import defaultdict
from collections import OrderedDict

length_of_list = 50
my_list = list(range(length_of_list))
num_selections = 10

my_dict = dict.fromkeys(my_list)

di = defaultdict(int)
for run in range(0, 500):
    numbers = random.sample(my_list, num_selections)
    for number in numbers:
        di[number] += 1


def get_top_numbers(data, n, order=False):
    """Gets the top n numbers from the dictionary"""
    top = sorted(data.items(), key=lambda x: x[1], reverse=True)[:n]
    if order:
        return OrderedDict(top)
    return dict(top)


print(get_top_numbers(di, n=10))
python python-3.x list dictionary random
3个回答
2
投票

检查收集模块的defaultdict,所以基本上,你创建一个默认值为defaultdict0,然后迭代你的numbers列表并将数字的值更新为+=1

from collections import defaultdict
di = defaultdict(int)
for run in range(0, 500):
    numbers = random.sample(my_list, num_selections)
    for number in numbers:
        di[number] += 1

    print(di)


4
投票

my_dict.update(number = number+1)在这一行中,您正在为函数调用的括号内的变量赋值。除非你给这个函数一个名为kwargnumber值为number+1,否则会出现以下错误:TypeError: 'number' is an invalid keyword argument for this function

dict.update也不接受整数而是另一个字典。你应该阅读有关这个​​函数的文档:https://www.tutorialspoint.com/python3/dictionary_update.htm这里说它的dict.update(dict2)需要一个字典,它将整合到dict中。见下面的例子:

dict = {'Name': 'Zara', 'Age': 7}
dict2 = {'Sex': 'female' }

dict.update(dict2)
print ("updated dict : ", dict)

结果如下:updated dict : {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}

到目前为止,对于代码中的错误,我看到已经给出了一个很好的答案,所以我不会重复他。


2
投票

您可以使用此任务collections.Counter提供添加方法。因此,您将使用两个计数器,一个是all和sum的总和,其中包含样本计数。

counter = collections.Counter()
for run in range(500):
    samples = random.sample(my_list, num_samples)
    sample_counter = collections.Counter(samples)
    counter = counter + sample_counter
© www.soinside.com 2019 - 2024. All rights reserved.