Запускать случайный алгоритм несколько раз и усреднять результаты - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть следующий скрипт случайного выбора:

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 ]

4 голосов
/ 07 апреля 2019

my_dict.update(number = number+1) в этой строке вы присваиваете новое значение переменной внутри скобок вызова функции.Если только вы не передаете функции kwarg с именем number со значением 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': 17}
dict2 = {'Gender': 'female' }

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

Дает в результате: updated dict : {'Gender': 'female', 'Age': 17, 'Name': 'Zara'}

Что касается ошибок в вашем коде, я вижу, что хороший ответ уже дан, поэтому я не буду его повторять.

2 голосов
/ 07 апреля 2019

Вы можете использовать для этой задачи 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
2 голосов
/ 07 апреля 2019

Оформление заказа defaultdict модуля коллекций. Таким образом, в основном вы создаете defaultdict со значением по умолчанию 0, а затем перебираете свой список 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...