Как нарезать круговой список итеративно? (Python 2,7) - PullRequest
0 голосов
/ 22 января 2020

Я разрезаю список объектов в al oop, но, похоже, не могу сделать обтекание концов этого списка даже при модульном индексировании:

N = 4
nums = range(N) # [0, 1, 2, 3]

for i in xrange(N):
    print nums[i: (i+2)%N]

отпечатков:

[0, 1]
[1, 2]
[]
[]

Как сделать так, чтобы он возвращал:

[0, 1]
[1, 2]
[2, 3]
[3, 0]

примечание: я использую Python 2.7 и не могу импортировать такие модули, как numpy

Ответы [ 3 ]

1 голос
/ 22 января 2020

Чтобы составить "истинную" круглую пару чисел, вы должны включить некоторые itertools:

from itertools import cycle, islice, izip

circ_list = izip(cycle(nums), islice(cycle(nums), 1, None))

Это бесконечный итератор, который будет продолжать давать виды чисел пары, которые вы хотите.

cycle(nums) будет бесконечно повторять ваш список чисел, islice(..., 1, None) пропускает первый его элемент, поэтому у вас, по сути, есть [0, 1, 2, ...] и [1, 2, 3, ...], которые izip объединяет.

Теперь вы можете, например, взять небольшой кусочек:

>>> list(islice(circ_list, 5))
[(0, 1), (1, 2), (2, 3), (3, 0), (0, 1)]
0 голосов
/ 22 января 2020

Или попробуйте использовать:

N = 4
nums = xrange(N)

for i in xrange(N):
    print (nums[i:(i+2)%(i+N)] + [0] * 2)[:2]
0 голосов
/ 22 января 2020

Или вы можете сделать:

N = 4
nums = range(N)

for i in xrange(N):
    print [nums[i], nums[(i+1)%N]]
[0, 1]
[1, 2]
[2, 3]
[3, 0]
...