Как развернуть зацикленный итератор? - PullRequest
1 голос
/ 05 ноября 2019

Вот мой список, который я преобразовал в iter, затем в cycle:

from itertools import cycle

lst = [1, 2, 3, 4]
itr = iter(lst)
ccl = cycle(lst)

Как я могу преобразовать его обратно в list - есть ли from itertools import uncycle?

Моя конечная цель - перетасовать ее с random.shuffle

Ответы [ 2 ]

3 голосов
/ 05 ноября 2019

Как уже упоминалось в комментариях, вы не можете напрямую перемешать генератор. Что вы можете сделать, это взять кусок с iterator.islice до длины списка и затем перемешать:

from itertools import islice

uncycled = list(islice(ccl, 0, len(lst)))
random.shuffle(uncycled)

print(uncycled)
# [2, 1, 4, 3]
0 голосов
/ 05 ноября 2019

Если конечной целью является циклический перемешанный список , нет необходимости играть с цепочкой «цикл / срез, циклический / разбор».
Вы можете обогатить цель с помощью пользовательской функции генератора:

from random import shuffle

def cycle_shuffled(lst):
    lst = lst[:]
    while True:
        shuffle(lst)
        yield lst

lst = [1, 2, 3, 4]
gen = cycle_shuffled(lst)

print(next(gen))   # [3, 2, 4, 1]
print(next(gen))   # [1, 3, 4, 2]
print(next(gen))   # [2, 4, 3, 1]
...