Вы подняли хороший вопрос, и хотя у вас есть хорошие ответы, я бы посоветовал вам избавиться от JSP. Это устаревшая технология, которая в конечном итоге умрет. Используйте современный подход, например, движки шаблонов. У вас будет очень четкое разделение слоев бизнеса и презентаций и, конечно же, кода Java в шаблонах, поэтому вы можете создавать шаблоны непосредственно из программного обеспечения для редактирования веб-презентаций, в большинстве случаев используя WYSIWYG.
И, конечно, избегайте фильтров и предварительной и последующей обработки, иначе вы можете столкнуться с трудностями поддержки / отладки, поскольку вы всегда не знаете, где переменная получает значение.
Я уверен, что кто-то собирается придумать еще немного «Pythonic», но как насчет:
for y in range(0, len(x), 2):
print "%s%s" % (x[y], x[y+1])
Обратите внимание, что это сработает, только если вы знаете, что len (x)% 2 == 0;
s = 'abcdefgh'
for e in (s[i:i+2] for i in range(0,len(s),2)):
print(e)
Одно решение, хотя я призываю кого-то сделать лучше; -)
a = 'abcdef'
b = [[a[i-1], a[i]] for i in range(1, len(a), 2)]
for x, y in b:
print "%s%s\n" % (x, y)
вы можете создать следующий генератор
def chunks(seq, size):
a = range(0, len(seq), size)
b = range(size, len(seq) + 1, size)
for i, j in zip(a, b):
yield seq[i:j]
и использовать его так:
for i in chunks('abcdef', 2):
print(i)
Не забывайте о функции zip ():
a = 'abcdef'
for x,y in zip(a[::2], a[1::2]):
print '%s%s' % (x,y)
Функция генератора должна быть аккуратной:
def batch_gen(data, batch_size):
for i in range(0, len(data), batch_size):
yield data[i:i+batch_size]
Пример использования:
a = "abcdef"
for i in batch_gen(a, 2): print i
печатает:
ab
cd
ef
У меня есть альтернативный подход, который работает для итераций, которые не имеют известной длины.
def groupsgen(seq, size):
it = iter(seq)
while True:
values = ()
for n in xrange(size):
values += (it.next(),)
yield values
Он работает путем перебора последовательности (или другого итератора) в группах размера, собирая значения в кортеже. В конце каждой группы он возвращает кортеж.
Когда у итератора заканчиваются значения, он генерирует исключение StopIteration, которое затем распространяется вверх, указывая, что groupsgen не имеет значений.
Предполагается, что значения входят в наборы размера (наборы 2, 3 и т. д.). Если нет, любые оставшиеся значения просто отбрасываются.
, но более общий способ будет (навеян этим ответом ):
for i in zip(*(seq[i::size] for i in range(size))):
print(i) # tuple of individual values
Как насчет itertools?
from itertools import islice, groupby
def chunks_islice(seq, size):
while True:
aux = list(islice(seq, 0, size))
if not aux: break
yield "".join(aux)
def chunks_groupby(seq, size):
for k, chunk in groupby(enumerate(seq), lambda x: x[0] / size):
yield "".join([i[1] for i in chunk])
>>> a = "abcdef"
>>> size = 2
>>> [a[x:x+size] for x in range(0, len(a), size)]
['ab', 'cd', 'ef']
..or, not as a list comprehension:
a = "abcdef"
size = 2
output = []
for x in range(0, len(a), size):
output.append(a[x:x+size])
Or, as a generator, which would be best if used multiple times (for a one-use thing, the list comprehension is probably "best"):
def chunker(thelist, segsize):
for x in range(0, len(thelist), segsize):
yield thelist[x:x+segsize]
..and it's usage:
>>> for seg in chunker(a, 2):
... print seg
...
ab
cd
ef
А также всегда есть документация .
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
try:
b.next()
except StopIteration:
pass
return izip(a, b)
def grouper(n, iterable, padvalue=None):
"grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)
Примечание: они производят кортежи вместо подстрок, когда в качестве входных данных приводится последовательность строк.