2016-02-27 3 views
0

Я хочу создать список и заполнить его 15 нулями, затем я хочу изменить 0 на 1 в 5 случайных точках списка, поэтому он имеет 10 нулей и 5 единиц, здесь это то, что я пыталсяRandom.randint в списках в Python

import random, time 

dasos = [] 

for i in range(1, 16): 
    dasos.append(0) 

for k in range(1, 6): 
    dasos[random.randint(0, 15)] = 1 

Иногда я хотел бы получить в любом месте от 0 до 5 единиц, но я хочу ровно 5 из них, , если я добавлю:

print(dasos) 

... чтобы увидеть мой список, я получаю:

IndexError: list assignment index out of range 
+0

Возможно, вам будет хорошо с помощью [random.sample] (https://docs.python.org/3/library/random.html#random.sample). – Gassa

+0

Используйте 'randrange (0, 15)' или 'randint (0, 14)' –

+0

Как говорит @Gassa, 'random.sample (range (15), 5)' даст вам 5 уникальных чисел от 0 до 14. –

ответ

1

Я думаю, что лучшим решением было бы использовать random.sample:

my_lst = [0 for _ in range(15)] 

for i in random.sample(range(15), 5): 
    my_lst[i] = 1 

Вы могли бы также рассмотреть возможность использования random.shuffle и использовать первые 5 записей:

my_lst = [0 for _ in range(15)] 
candidates = list(range(15)) 
random.shuffle(candidates) 

for i in candidates[0:5]: 
    my_lst[i] = 1 

TL; DR: Прочитайте Питон random documentation, это можно сделать несколькими способами.

+0

Я не предлагал ничего из этого, потому что ясно, что это только вызовет замешательство в OP, что, по-видимому, очень новое для программирования. На мой взгляд, такие вещи, как понимание списков, невероятно ужасны для обучения программированию. Мое решение, возможно, не предназначено для большинства питонических, но оно более интуитивное для новичка. – nbro

+0

Если вы действительно хотите научиться программировать компьютер, то узнайте C. – nbro

+0

Обратите внимание, что реализация 'random.choice' имеет ту же проблему, что и исходный код участника: он может выбрать один и тот же индекс более одного раза. Решение 'shuffle' также должно быть настроено для работы в Python 3, где' range' возвращает неперечисленный итеративный. Используйте 'кандидаты = список (диапазон (15))', чтобы убедиться, что вы получили фактический список, который можно перетасовать. – Blckknght

0

Причина, по которой у вас иногда меньше 5 единиц, заключается в том, что randon.randint(0, 15) может производить одинаковое число во время цикла for. Чтобы решить эту проблему, я бы отслеживать, какие уже выбраны показатели:

import random, time 


dasos = [] 

for i in range(15): 
    dasos.append(0) 

chosen_indices = set() 

for k in range(1, 6): 
    index = random.randint(0, 14) 
    while index in chosen_indices: 
     index = random.randint(0, 14)   
    dasos[index] = 1 
    chosen_indices.add(index) 

print(dasos) 

Я использую set, потому что поиск в set объект должен быть примерно в constant time operation (in the average case).

Причина, почему вы получаете в IndexError потому, что randint(a, b) возвращает int между a и bи включены. Итак, если вы делаете randint(0, 15), он может также вернуть 15, но, помните, list s в Python индексируются начиная с 0. Это означает, что если dasos содержит 15 элементов, первый элемент индексируется 0, а последний - 14.

Смежные вопросы