2015-11-11 3 views
1

Скажут, у меня есть строка:Перебора строки в Тройках

string = 'ABCDEFGHI' 

, и я хочу, чтобы перебирать струны, так что выход будет:

ABC 
DEF 
GHI 

ли это возможно? Могу ли я просто что-то сделать в соответствии с:

for i in string, 3: 
    print i 

Я чувствую, что есть более легкое решение, которое мне не хватает.

+0

Возможно ли, что длина делится на 3? Как вы хотите обработать случай, когда строка '' ABCDEFGHIJK''? – mgilson

+0

У меня есть метод, который гарантирует, что строка делится на 3. – Sean

ответ

1

Простой for петля для достижения этой цели будет:

for i in range(3, len(string) + 1, 3): 
    print string[i-3:i] 

который использует значение step=3 для range() итерировать по 3's, а затем, используя slice объект, который зависит от величины i вы получите в результате нарезанная строка. Для string = 'ABCDEFGHI' Печатается:

ABC 
DEF 
GHI 

И, конечно, вы можете удалить жёстко прописанные 3 с переменной, скажем gap = 3 сделать петлю визуально более приятным:

gap = 3 
for i in range(gap, len(string) + 1, gap): 
    print string[i-gap: i] 
+0

Зачем начинать с 'gap' вместо' 0' с 'print string [i: i + gap]'? - Кажется, это немного больше того, чего я ожидал бы ... – mgilson

+0

Это фактически заставило бы счетчик переходить через 'len (string) + 1' limit и индексировать' string' с помощью 'string [9:12]' (в этом случае). Конечно, изменение 'stop' на' len (string) - 1' делает трюк, но, кажется, менее интуитивно, по крайней мере для меня. –

0

Вы можете создать функцию генератора, как так :

def trios(seq): 
    result = [] 
    for e in seq: 
     result.append(e) 
     if len(result) == 3: 
      yield result 
      result = [] 
    if result: 
     yield result 

И использовать его так:

>>> string = "ABCDEFGHIJ" 
>>> [t for t in trios(string)] 
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I'], ['J', 'K']] 

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

def trios(seq): 
    result = [] 
    for e in seq: 
     result.append(e) 
     if len(result) == 3: 
      yield result 
      result = [] 
0

Взгляните на grouper recipe on the itertools документы. Как написано, он возвращает tuple с, не новые str с, но это тривиально адаптируемой:

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return izip_longest(*args, fillvalue=fillvalue) 

только твик, чтобы обернуть последнюю строку, чтобы сделать его преобразовать tuple s zip_longest производит обратно str:

return map(''.join, izip_longest(*args, fillvalue=fillvalue)) 
Смежные вопросы