Вывод списка слов в случайном порядке без повторений

Рейтинг: 3Ответов: 6Опубликовано: 10.03.2015

Не могу разобраться с задачкой.

Создайте программу, которая будет выводить список слов в случайном порядке. На экране должны печататься без повторений все слова из представленного списка.

Вот мой код:

spisok = ["Alex", "Kate", "Love", "World", "Peace", "Putin",]
empty_list = []

count = len(spisok)
schetchik = 0

while count != schetchik:
        for item in spisok:
            randitem = random.choice(spisok)
            schetchik += 1
            if randitem not in spisok:
                empty_list += randitem
            else:
                break
        print(empty_list)

Скриншот результата выполнения:

alt text

Выводит пустой список.

Ответы

▲ 8

Раз пошла такая пьянка, то вот мой вариант:

import random
spisok = ["Love", "World", "Peace", "Putin",]
random.shuffle(spisok)
print spisok
▲ 6

Чтобы вывести уникальные слова из списка в случайном порядке, используя различные генераторы псевдослучайных чисел:

#!/usr/bin/env python
import random

words =  ["Alex", "Kate", "Love", "World", "Peace", "Putin",]
unique_words = list(set(words))
random.shuffle(unique_words) # shuffle using default Mersenne Twister generator
random.SystemRandom().shuffle(unique_words)  # OS-provided generator
print("\n".join(unique_words))
▲ 4
import random
spisok = ["Love", "World", "Peace", "Putin",]

while spisok:
    print spisok.pop(random.randint(0, len(spisok)-1))
▲ 2

Я бы сделал это так:

    import random
    spisok = ["Alex", "Kate", "Love", "World", "Peace", "Putin",]
    empty_list = []
    while len(empty_list) != len(spisok):
            randitem = random.choice(spisok)
            if randitem not in empty_list:
                empty_list.append(randitem)  
    print(empty_list)

Обновление

Но этот вариант не подходит для длинных списков. А вот @ВОРОН бы сделал так:

import random
spisok = ...
empty_list = []
for item in spisok:
    rand_index = random.randint(0, len(empty_list)
    empty_list.insert(rand_index), item)

и этот вариант гораздо лучше.

▲ 2

Можно даже так:

>>> import random
>>> array = ["Alex", "Kate", "Love", "World", "Peace", "Putin"]
>>> print(*random.sample(set(array), len(set(array))), sep='\n')
▲ 1

@BOPOH,

чтобы и список исходный не меняло, и памяти почти не ело ))

Challange accepted

import random
def iter_shuffled(l):
    indices = list(range(len(l)))
    random.shuffle(indices)
    for i in indices:
        yield l[i]

spisok = ["Love", "World", "Peace", "Putin",]
for item in iter_shuffled(spisok):
    print (item)

UPDATE Т.к. при копировании списка элементами нового списка станут ссылки на исходные значения, то можно обойтись и без списка индексов:

import random
def iter_shuffled(l):
    new_list = list(l)
    random.shuffle(new_list)
    for item in new_list:
        yield item

Но тогда смысл оформлять код в виде функции-итератора практически теряется и код можно сократить до следующих строк:

import random
spisok = ["Love", "World", "Peace", "Putin",]
new_list = list(spisok)
random.shuffle(new_list)
print new_list