2014-10-23 2 views
-3

У меня есть строка 'ABCDEFG' Я хочу, чтобы иметь возможность перечислять каждый символ последовательно, а затем следующий. ПримерКак разбить строку на символы в python

А Б

Б

С D

Д Е

Е

Ж

G

Можете ли вы сказать мне эффективный способ сделать это? Благодаря

+1

Я попытался сохранить его в виде списка, но я не могу просматривать список – Ssank

+3

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

+0

Я сохранил указанную выше строку в файле ref.txt и запустил этот фрагмент кода, который содержит всю строку, но не символы iterativelyif __name__ == '__main__': с открытым ('ref.txt'), как f: f1 = f.read(). splitlines() l = list (f1) print l, f1, len (l) – Ssank

ответ

0

Как вы хотите, пространство между символами можно использовать zip функции и список понимание:

>>> s="ABCDEFG" 
>>> l=[' '.join(i) for i in zip(s,s[1:])] 
['A B', 'B C', 'C D', 'D E', 'E F', 'F G'] 
>>> for i in l: 
... print i 
... 
A B 
B C 
C D 
D E 
E F 
F G 

, если вы не хотите, пространство просто использовать список понимание:

>>> [s[i:i+2] for i in range(len(s))] 
['AB', 'BC', 'CD', 'DE', 'EF', 'FG', 'G'] 
3

В Python, строка уже рассматривается как перечислимый список символов, поэтому вам не нужно разбить его; он уже «расколот». Вам просто нужно создать список подстрок.

Это не ясно, какую форму вы хотите результат в случае, если вы просто хотите подстроки, это работает:.

s = 'ABCDEFG' 
[s[i:i+2] for i in range(len(s))] 
#=> ['AB', 'BC', 'CD', 'DE', 'EF', 'FG', 'G'] 

Если вы хотите пары себе быть списки вместо строк, просто вызовите list на каждом :

[list([s[i:i+2]) for i in range(len(s))] 
#=> [['A', 'B'], ['B', 'C'], ['C', 'D'], ['D', 'E'], ['E', 'F'], ['F', 'G'], ['G']] 

И если вы хотите строки в конце концов, но с чем-то, как пространство между буквами, присоединиться к ним снова вместе после list вызова:

[' '.join(list(s[i:i+2])) for i in range(len(s))] 
#=> ['A B', 'B C', 'C D', 'D E', 'E F', 'F G', 'G'] 
+1

он хочет пространства между персонажами! – Kasramvd

0

Вашей проблема заключается в том, что у вас есть список строк, а не строка:

with open('ref.txt') as f: 
    f1 = f.read().splitlines() 

f.read() возвращает строку. Вы вызываете на него splitlines(), получая список строк (по одной в строке). Если ваш ввод действительно 'ABCDEFG', это, конечно же, будет список одной строки, ['ABCDEFG'].

l = list(f1) 

Поскольку f1 уже список, это просто делает l дубликат этого списка.

 print l, f1, len(l) 

И это просто выводит список строк, и копию списка строк и количество строк.

Итак, во-первых, что произойдет, если вы сбросите splitlines()? Тогда f1 будет строка 'ABCDEFG', а не список с одной строкой. Это хорошее начало.И вы можете полностью удалить часть l, потому что f1 уже является итерируемым для своих персонажей; list(f1) будет просто итерабельным из тех же символов.

Итак, теперь вы хотите напечатать каждую букву следующей буквой. Один из способов сделать это - zip ping 'ABCDEFG' и 'BCDEFG '. Но как вы это получите 'BCDEFG '? Просто; это всего лишь f1[1:] + ' '.

Итак:

with open('ref.txt') as f: 
    f1 = f.read() 
    for left, right in zip(f1, f1[1:] + ' '): 
     print left, right 

Конечно для чего-то это просто, есть много других способов сделать то же самое. Вы можете перебрать range(len(f1)) и получить срезы 2-элементные, или вы можете использовать itertools.zip_longest, или вы можете написать общего назначения «перекрывая соседние группы размера N из любого Iterable» функции из itertools.tee и zip и т.д.

2

Вы должны держать последний символ, так что используйте izip_longest из itertools

>>> import itertools 
>>> s = 'ABCDEFG' 
>>> for c, cnext in itertools.izip_longest(s, s[1:], fillvalue=''): 
...  print c, cnext 
...  
A B 
B C 
C D 
D E 
E F 
F G 
G 
1
def doit(input): 
    for i in xrange(len(input)): 
     print input[i] + (input[i + 1] if i != len(input) - 1 else '') 

doit("ABCDEFG") 

Что дает:

>>> doit("ABCDEFG") 
AB 
BC 
CD 
DE 
EF 
FG 
G 
0

Там в itertools pairwise recipe именно для этого случая использования:

import itertools 

def pairwise(myStr): 
    a,b = itertools.tee(myStr) 
    next(b,None) 
    for s1,s2 in zip(a,b): 
     print(s1,s2) 

Выход:

In [121]: pairwise('ABCDEFG') 
A B 
B C 
C D 
D E 
E F 
F G 
Смежные вопросы