Подтвердить что ты не робот

Список пифонических кругов

Скажем, у меня есть список,

l = [1, 2, 3, 4, 5, 6, 7, 8]

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

i = l.index(n)
j = l[i-1]
k = l[i+1]

Однако для случая края, когда i == len(l) - 1 это не удается. Поэтому я думал, что просто оберну его,

if i == len(l) - 1:
    k = l[0]
else:
    k = l[i+1]

Есть ли питонический способ сделать это?

4b9b3361

Ответ 1

Вы можете использовать оператор modulo!

i = len(l) - 1
jIndex = (i - 1) % len(l)
kIndex = (i + 1) % len(l)

j = l[jIndex]
k = l[kIndex]

Или, чтобы быть менее подробным:

k = l[(i + 1) % len(l)]

Ответ 2

Самый простой способ обернуть список фиксированной длины - с помощью оператора% (modulo)

list_element = my_list[idx % len(my_list)]

но в любом случае посмотрите http://docs.python.org/library/itertools.html

from itertools import cycle

for p in cycle([1,2,3]):
  print "endless cycle:", p

Ответ 3

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

k = l[(i + 1) % len(l)]

Ответ 4

Если вы хотите, чтобы это был класс, я взломал этот быстрый круглый список:

class CircularList(list):
    def __getitem__(self, x):
        if isinstance(x, slice):
            return [self[x] for x in self._rangeify(x)]
        return super().__getitem__(x % len(self))

    def _rangeify(self, slice):
        start, stop, step = slice.start, slice.stop, slice.step
        if start is None:
            start = 0
        if stop is None:
            stop = len(self)
        if step is None:
            step = 1
        return range(start, stop, step)

Он поддерживает нарезку, поэтому

CircularList(range(10))[1:100] == [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8]

Ответ 5

Если вы не хотите обертывать, самый питоновский ответ - использовать срезы. Недостающий сосед замещен None. Например:.

def nbrs(l, e):
   i = l.index(e)
   return (l[i-1:i] + [None])[0], (l[i+1:i+2] + [None])[0]

Вот как может работать функция:

>>> nbrs([2,3,4,1], 1)
(4, None)
>>> nbrs([1,2,3], 1)
(None, 2)
>>> nbrs([2,3,4,1,5,6], 1)
(4, 5)
>>> nbrs([], 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in nbrs
ValueError: 1 is not in list

Ответ 6

a = [2,3,5,7,11,13]

def env (l, n, count):
    from itertools import cycle, islice
    index = l.index(n) + len(l)
    aux = islice (cycle (l), index - count, index + count + 1)
    return list(aux)

Действует следующим образом

>>> env (a, 2,1)
[13, 2, 3]
>>> env (a,13,2)
[7, 11, 13, 2, 3]
>>> env (a,7,0)
[7]