Как вывести список списков в Python в нужном виде?

Дан начальный список:
[1,2,3,4,5]
Нужно вывести список списков вида:
[[1,2,3,4,5], [2,3,4,5,1], [3,4,5,1,2], [4,5,1,2,3], [5,1,2,3,4]]
Что мне нужно исправить в коде,чтобы получить правильный результат?

a=[1,2,3,4,5]
x=[]
for i in range(len(a)):
    a.append(a.pop(0))
    x.append(a)
    print(x)

Ответы (5 шт):

Автор решения: Zhihar

В лоб:

x = [1, 2, 3, 4, 5]

z = []

for j in range(len(x)):
    y = []

    for i in range(len(x)):
        y.append(x[(i + j) % len(x)])

    z.append(y)

print(z)

чуть покороче вариант:

x = [1, 2, 3, 4, 5]

z = []

for j in range(len(x)):
    z.append(list(map(lambda i : x[(i + j) % len(x)], range(len(x)))))

print(z)

и совсем коротко:

x = [1, 2, 3, 4, 5]

z = list(map(lambda j: list(map(lambda i : x[(i + j) % len(x)], range(len(x)))), range(len(x))))

print(z)

и ещё чуть покороче:

x = [1, 2, 3, 4, 5]

z = list(map(lambda j, s=len(x): list(map(lambda i: x[(i + j) % s], range(s))), range(len(x))))

print(z)

и ещё чуть покороче :)

x = [1, 2, 3, 4, 5]

z = [*map(lambda j, s=len(x): [*map(lambda i: x[(i + j) % s], range(s))], range(len(x)))]

print(z)
→ Ссылка
Автор решения: Danis
a=[1,2,3,4,5]
x=[]
for i in range(len(a)):
    x.append(a.copy())
    a.append(a.pop(0))
    print(x) 
→ Ссылка
Автор решения: mkkik

Использование deque позволяет писать лаконичный код для таких задач:

from queue import deque

l = [1, 2, 3, 4, 5]

d = deque(l)
result = []
for _ in range(len(d)):
    result.append(list(d))
    d.append(d.popleft())
print(result)
→ Ссылка
Автор решения: imitusov

Можно при помощи генератора:

a = list(range(1, 6))
[a[i:] + a[:i] for i in range(len(a))]

[[1, 2, 3, 4, 5],
 [2, 3, 4, 5, 1],
 [3, 4, 5, 1, 2],
 [4, 5, 1, 2, 3],
 [5, 1, 2, 3, 4]]

Немного быстрее, чем вариант выше

%%timeit
[a[i:] + a[:i] for i in range(len(a))]
1.12 µs ± 6.34 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

x = list(range(1, 6))
list(map(lambda j: list(map(lambda i : x[(i + j) % len(x)], range(len(x)))), range(len(x))))
5.86 µs ± 27.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
→ Ссылка
Автор решения: Михаил Муругов
# Исходные данные
a = list(range(1,6))

# Результат
x = [sorted(a, key=lambda item: item % e) for e in a]

Объяснение:

  1. lambda item: item % e - функция, возвращающая остаток от деления на e;
  2. sorted(a, key=lambda item: item % e) - сортированный список a. Сортируем по остатку от деления на e;
  3. [sorted(a, key=lambda item: item % e) for e in a] - список отсортированных списков a по остатку от деления на e для каждого e из a.
→ Ссылка