Как выбрать несколько максимальных значений из списка целых чисел? - PullRequest
0 голосов
/ 24 ноября 2018

Используя Python 3.6 с PyCharm, я начинаю с инициализированного списка из 12 целых чисел.Это позволяет мне применять случайное число к каждому значению в списке.Затем я хочу выбрать самую высокую шестерку из списка 12 вариантов.Вот код, который я использовал для достижения этой цели:

import random as rnd

# Initialize with a list of 12 zeros
options = [0, 0, 0, 0,
           0, 0, 0, 0,
           0, 0, 0, 0]

# Loop through the list, replacing zeros with random numbers
for i in range(len(options)):
    options[i] = rnd.randint(3, 18)

# Next, find the six max
options_copy = options[:]
largest_1 = max(options_copy)   # This seems very inefficient.
options_copy.remove(largest_1)  # 
largest_2 = max(options_copy)   # What if I need the top 7,000 from 
options_copy.remove(largest_2)  # a list of 1 million?
largest_3 = max(options_copy)   #
options_copy.remove(largest_3)  #
largest_4 = max(options_copy)   #
options_copy.remove(largest_4)  #
largest_5 = max(options_copy)   #
options_copy.remove(largest_5)  #
largest_6 = max(options_copy)   #
options_copy.remove(largest_6)  #

# Collect the best into it's own list.
best = [largest_1, largest_2, largest_3,
        largest_4, largest_5, largest_6]

Как сказано в разделе комментариев в приведенном выше коде, это кажется очень неэффективным.Например, предположим, мне нужно было найти первые 7000 из списка 1 миллион целых чисел.Существует ли эффективный петлевой механизм, который достигает того же результата?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Вы можете сделать это с пониманием списка и срезом, чтобы получить первые 6 значений после сортировки:

sorted((rnd.randint(3, 18) for _ in range(12)), reverse=True)[:6]
0 голосов
/ 24 ноября 2018

Используйте random.sample, чтобы сгенерировать список из 12 случайных чисел, а затем отсортировать их в обратном порядке и сначала захватить 6:

import random

options = random.sample(range(3, 18), 12)
print(options)

best = sorted(options, reverse=True)[:6]


Более кратко:
best = sorted(random.sample(range(3, 18), 12), reverse=True)[:6]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...