【问题标题】:Run a random algorithm mutiple times and average over the results多次运行随机算法并对结果取平均值
【发布时间】:2019-08-28 16:24:23
【问题描述】:

我有以下随机选择脚本:

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


    【解决方案1】:

    集合模块的结帐defaultdict, 所以基本上,你创建一个默认值为0defaultdict,然后遍历你的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)
    
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        my_dict.update(number = number+1) 在这一行中,您正在为函数调用括号内的变量分配一个新值。除非你给函数一个 kwarg 称为 numbernumber+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': 17}
        dict2 = {'Gender': 'female' }
        
        dict.update(dict2)
        print ("updated dict : ", dict)
        

        作为结果给出: updated dict : {'Gender': 'female', 'Age': 17, 'Name': 'Zara'}

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

        【讨论】:

          猜你喜欢
          • 2015-05-21
          • 1970-01-01
          • 1970-01-01
          • 2020-01-14
          • 1970-01-01
          • 2011-10-12
          • 1970-01-01
          • 2015-06-02
          • 1970-01-01
          相关资源
          最近更新 更多