Как вывести по одному элементу из списка?
Задача: Создайте программу, которая будет выводить список слов в случайном порядке. На экране должны печататься без повторений все слова из представленного списка.
В интернете нашел некоторые способы, но я хочу понять, почему такой код не работает. На первый взгляд, все должно работать, но, очевидно, я что-то упусукаю). Впервые тут, извините, если что-то не так)
import random
a = [1, 1, 1, 2, 3, 4, 5]
while a:
num = random.choice(a)
for i in a:
if i == num:
a.remove(i)
print(num)
Ответы (4 шт):
Ваш код легко починить, достаточно итерироваться по копии списка:
for i in a.copy():
^^^^^^^
Проблема в том, что когда вы удаляете элементы из списка, по которому итерируетесь, то процесс итерирования сбивается и пропускает элементы из-за того, что изменилась "на ходу" длина списка.
Обратите внимание на ваше условие: "На экране должны печататься без повторений все слова из представленного списка." Это можно решить через преобразование листа в множество. Множество в python - "контейнер", содержащий не повторяющиеся элементы в случайном порядке.
a = [1, 1, 1, 2, 3, 4, 5]
b = set(a)
for x in b:
print(x)
Во-первых, для исключения дубликатов нужно сделать то, что @A_Vaclav со множеством посоветовал.
Во-вторых, для вывода очищенного списка в случайном порядке его можно перемешать с помощью функции shuffle
import random
a = [1, 1, 1, 2, 3, 4, 5]
a = list(set(a))
print(a)
random.shuffle(a)
for x in a:
print(x)
А можно и вручную выполнить перемешивание Фишера-Йетса. Заметьте, что выбранный элемент ставится в конец (в текущую конечную позицию), и при желании его можно удалять из списка.
n = len(a)
for i in range(n):
id = random.randint(0, n - i - 1)
a[n - i - 1], a[id] = a[id], a[n - i - 1]
print(a[n - i - 1])
import random
a = [1, 1, 1, 2, 3, 4, 5]
while a:
num = random.choice(a)
while num in a:
a.remove(num)
print(num, end=" ")