Ответ 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)]
Скажем, у меня есть список,
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]
Есть ли питонический способ сделать это?
Вы можете использовать оператор 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)]
Самый простой способ обернуть список фиксированной длины - с помощью оператора% (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
Типичным способом подгонки значений к определенному диапазону является использование оператора %
:
k = l[(i + 1) % len(l)]
Если вы хотите, чтобы это был класс, я взломал этот быстрый круглый список:
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]
Если вы не хотите обертывать, самый питоновский ответ - использовать срезы. Недостающий сосед замещен 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
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]