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

时间:2019-04-07 10:17:17

标签: python python-3.x list dictionary random

我有以下随机选择脚本:

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))

3 个答案:

答案 0 :(得分:4)

my_dict.update(number = number+1)在此行中,您正在为函数调用括号内的变量分配新值。除非您为函数提供一个名为number的{​​{1}},其值为number+1,否则会出现以下错误: TypeError: 'number' is an invalid keyword argument for this function

dict.update也不接受整数,但接受另一个字典。您应该阅读有关此功能的文档:kwarg 这里说的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'}

到目前为止,对于您代码中的错误,我看到已经给出了很好的答案,所以我不再赘述。

答案 1 :(得分:2)

结帐模块defaultdict的结帐, 因此,基本上,您将创建一个默认值为defaultdict的{​​{1}},然后遍历您的0列表,并将数字的值更新为numbers

+=1

答案 2 :(得分:2)

您可以为此任务collections.Counter使用,它提供了附加方法。因此,您将使用两个计数器,一个是所有计数器的和,另一个是包含样本计数的计数器。

counter = collections.Counter()
for run in range(500):
    samples = random.sample(my_list, num_samples)
    sample_counter = collections.Counter(samples)
    counter = counter + sample_counter