Выполнить итерации по последовательности Python в кратных числах n?

Вы подняли хороший вопрос, и хотя у вас есть хорошие ответы, я бы посоветовал вам избавиться от JSP. Это устаревшая технология, которая в конечном итоге умрет. Используйте современный подход, например, движки шаблонов. У вас будет очень четкое разделение слоев бизнеса и презентаций и, конечно же, кода Java в шаблонах, поэтому вы можете создавать шаблоны непосредственно из программного обеспечения для редактирования веб-презентаций, в большинстве случаев используя WYSIWYG.

И, конечно, избегайте фильтров и предварительной и последующей обработки, иначе вы можете столкнуться с трудностями поддержки / отладки, поскольку вы всегда не знаете, где переменная получает значение.

25
задан SilentGhost 17 April 2009 в 15:15
поделиться

11 ответов

Я уверен, что кто-то собирается придумать еще немного «Pythonic», но как насчет:

for y in range(0, len(x), 2):
    print "%s%s" % (x[y], x[y+1])

Обратите внимание, что это сработает, только если вы знаете, что len (x)% 2 == 0;

9
ответ дан 28 November 2019 в 17:42
поделиться

s = 'abcdefgh'
for e in (s[i:i+2] for i in range(0,len(s),2)):
  print(e)
1
ответ дан 15 October 2019 в 14:50
поделиться

Одно решение, хотя я призываю кого-то сделать лучше; -)

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)
-1
ответ дан Jason Coon 15 October 2019 в 14:50
поделиться

вы можете создать следующий генератор

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)
3
ответ дан SilentGhost 15 October 2019 в 14:50
поделиться

Не забывайте о функции zip ():

a = 'abcdef'
for x,y in zip(a[::2], a[1::2]):
  print '%s%s' % (x,y)
10
ответ дан Jason Coon 15 October 2019 в 14:50
поделиться

Функция генератора должна быть аккуратной:

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
46
ответ дан rpr 15 October 2019 в 14:50
поделиться

У меня есть альтернативный подход, который работает для итераций, которые не имеют известной длины.

   
def groupsgen(seq, size):
    it = iter(seq)
    while True:
        values = ()        
        for n in xrange(size):
            values += (it.next(),)        
        yield values    

Он работает путем перебора последовательности (или другого итератора) в группах размера, собирая значения в кортеже. В конце каждой группы он возвращает кортеж.

Когда у итератора заканчиваются значения, он генерирует исключение StopIteration, которое затем распространяется вверх, указывая, что groupsgen не имеет значений.

Предполагается, что значения входят в наборы размера (наборы 2, 3 и т. д.). Если нет, любые оставшиеся значения просто отбрасываются.

13
ответ дан 28 November 2019 в 17:42
поделиться

, но более общий способ будет (навеян этим ответом ):

for i in zip(*(seq[i::size] for i in range(size))):
    print(i)                            # tuple of individual values
6
ответ дан 28 November 2019 в 17:42
поделиться

Как насчет 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])
0
ответ дан 28 November 2019 в 17:42
поделиться
>>> 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
4
ответ дан 28 November 2019 в 17:42
поделиться

А также всегда есть документация .

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)

Примечание: они производят кортежи вместо подстрок, когда в качестве входных данных приводится последовательность строк.

6
ответ дан 28 November 2019 в 17:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: