2017-05-13 6 views
0

Angenommen -Wie wiederhole ich eine Zeichenfolge in Gruppen von n Zeichen anstelle von jeweils einem Zeichen?

string = "abcdefgh" 

Wenn ich das tue -

for i in string: 
    print (i) 

ich -

a 
b 
c 
d 
e 
f 
g 

Was ich möchte so etwas wie -

ab 
bc 
cd 
de 
ef 
fg 

oder in jeder anderen Gruppierung wir spec ify. Ist es möglich, dafür eine Funktion zu übernehmen und dabei die benötigte Gruppierung zu berücksichtigen?

Dank
+0

Related: http://stackoverflow.com/questions/312443/how-do-you-split-a-list- in-gleichmäßig-Größe-Brocken – TerryA

Antwort

0

Dies funktioniert:

string = "abcdefgh" 

i = 0 
while i < len(string) - 1: 
    print(string[i]+string[i+1]) 
    i += 1 

Ergebnis: while i < len(string) - 2::

ab 
bc 
cd 
de 
ef 
fg 
gh 

Wenn Sie nicht gh wollen (es ist in Ihrem Beispiel fehlt), die while-Schleife ändern.

Auch eine andere Art und Weise zu tun (was geschrieben wurde nicht), ist über regex:

import re 

print("\n".join(re.findall(r'(?=(\w\w))', 'abcdefgh'))) 

Die (?=) (Look-Ahead-Behauptung), zu überlappen regex Muster ermöglicht.

>>> for i, j in zip(string, string[1:]): 
...  print(i+j) 
... 
ab 
bc 
cd 
de 
ef 
fg 
gh 

Als Funktion:

-1
import re 
def splittext(text, split_by): 
    '''the regex will take a string and create groupings of n-characters plus a final grouping of any remainder. if no remainder is desired, the |.+ can be removed''' 
    return re.findall(r".{%d}|.+" % split_by, text) 

ret = splittext("HELLOWORLD!", 2) 
print "\n".join(ret) 

einige Beispielausgabe

>>> re.findall(r".{2}",a) 
['HE', 'LL', 'OW', 'OR', 'LD'] 
>>> re.findall(r".{2}|.{1}",a) 
['HE', 'LL', 'OW', 'OR', 'LD', '!'] 
>>> re.findall(r".{2}|.*",a) 
['HE', 'LL', 'OW', 'OR', 'LD', '!', ''] 
>>> re.findall(r".{2}|.+",a) 
['HE', 'LL', 'OW', 'OR', 'LD', '!'] 
>>> print "\n".join(_) 
HE 
LL 
OW 
OR 
LD 
! 
>>>  
+0

Das ist nicht, was sie wollen ... – Li357

+0

Clever. Leider ist clever in der Regel ein Zeichen für eine schlechte Idee. –

+0

Ihr anfängliches Beispiel war fast korrekt, Sie mussten nur 'overlapped = True' hinzufügen, siehe [hier] (http://Stackoverflow.com/a/18966698/1695437). Alternativ können Sie eine Lookahead Assertion ('(? =)') Verwenden. – Darkstarone

2

können Sie zip() verwenden

def func(seq, n): 
    return [''.join(item) for item in zip(*[seq[n:] for n in range(n)])] 

Beispiel:

>>> for item in func("abcdefgh", 3): 
...  print(item) 
... 
abc 
bcd 
cde 
def 
efg 
fgh 
1

wenn s der Name Ihrer Zeichenfolge ist, wird dieses Verständnis tun, was Sie wollen:

[s[i:i+2] for i in range(0, len(s) - 1)]

Mit diesem können Sie bequem die Saiten auf separaten Zeilen drucken:

for substr in [s[i:i+2] for i in range(0, len(s) -1)]: 
    print substr 

Es kann relativ einfach generalisiert werden:

def subgroups(s, n): 
    return [s[i:i+n] for i in range(0, len(s) - 1)] 

(und diese Funktion kann in ähnlicher Weise verwendet werden, um die resultierenden Teilstrings in irgendeiner Weise zu drucken, die Sie mögen)

+0

Das ist nicht, was OP will – TerryA

+0

Dies gibt '['ab', 'cd', 'ef ',' gh '] ', die die Überlappungen nicht enthält. – Darkstarone

+1

Fair genug. Fest. –

Verwandte Themen