2009-10-25 8 views

Antwort

28

Hier ist eine andere Lösung:

span = 2 
words = "this-is-a-string".split("-") 
print ["-".join(words[i:i+span]) for i in range(0, len(words), span)] 
+0

Danke, Nick D. – Gumbo

+0

Warum die Abstimmung unten? Was ist falsch an dieser Antwort? – Gumbo

+0

Dies scheint am einfachsten für eine variable Länge zwischen den Trennungen zu arbeiten. – Gnuffo1

0
l = 'this-is-a-string'.split() 
nl = [] 
ss = "" 
c = 0 
for s in l: 
    c += 1 
    if c%2 == 0: 
     ss = s 
    else: 
     ss = "%s-%s"%(ss,s) 
     nl.insert(ss) 

print nl 
+0

Was ist n? Ich bekomme einen Namensfehler, da dieser nicht definiert ist. – Gnuffo1

+0

Entschuldigung, ich habe deine Frage zum ersten Mal falsch gelesen und neu geschrieben, n war ein Rest von vorherigem. Jetzt gibt es eine Liste von Strings. – SpliFF

+0

Dies ist sehr kompliziert (lange zu lesen/zu entschlüsseln), im Vergleich zu vielen anderen hier vorgeschlagenen Lösungen ... – EOL

0

EDIT: Der ursprüngliche Code, den ich geschrieben hat nicht funktioniert. Diese Version tut:

Ich glaube nicht, dass Sie auf jedem anderen teilen können, aber Sie könnten auf jeder teilen - und jedes Paar beitreten.

chunks = [] 
content = "this-is-a-string" 
split_string = content.split('-') 

for i in range(0, len(split_string) - 1,2) : 
    if i < len(split_string) - 1: 
     chunks.append("-".join([split_string[i], split_string[i+1]])) 
    else: 
     chunks.append(split_string[i]) 
+0

Das funktioniert nicht, ich bekomme '[" - "," - "," - "," - "]' –

+0

Das funktioniert nicht. Die Ausgabe besteht aus einer Liste von 1 Zeichenfolgen, die einen Bindestrich enthalten. – recursive

+0

@Jed Seine Idee ist gut, Sie könnten die Implementierung Ihre eigenen schreiben. –

9

Reguläre Ausdrücke handhaben dies leicht:

import re 
s = "aaaa-aa-bbbb-bb-c-ccccc-d-ddddd" 
print re.findall("[^-]+-[^-]+", s) 

Ausgang:

['aaaa-aa', 'bbbb-bb', 'c-ccccc', 'd-ddddd'] 

Update für Nick D:

n = 3 
print re.findall("-".join(["[^-]+"] * n), s) 

Ausgang:

['aaaa-aa-bbbb', 'bb-c-ccccc'] 
+1

Wahrscheinlich die eleganteste Lösung, die noch lesbar ist, der Rest dehnt sie aus. –

+1

gute Antwort, aber es ist nur für jeden 2. Separator. –

+0

... und nur für eine gerade Anzahl von Wörtern. – Gumbo

16
>>> s="a-b-c-d-e-f-g-h-i-j-k-l"   # use zip(*[i]*n) 
>>> i=iter(s.split('-'))    # for the nth case  
>>> map("-".join,zip(i,i))  
['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l'] 

>>> i=iter(s.split('-')) 
>>> map("-".join,zip(*[i]*3)) 
['a-b-c', 'd-e-f', 'g-h-i', 'j-k-l'] 
>>> i=iter(s.split('-')) 
>>> map("-".join,zip(*[i]*4)) 
['a-b-c-d', 'e-f-g-h', 'i-j-k-l'] 

Manchmal ist itertools.izip schneller, wie Sie in den Ergebnissen

>>> from itertools import izip 
>>> s="a-b-c-d-e-f-g-h-i-j-k-l" 
>>> i=iter(s.split("-")) 
>>> ["-".join(x) for x in izip(i,i)] 
['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l'] 

Hier ist eine Version, die Art arbeitet mit einem sehen ungerade Anzahl von Teilen abhängig davon, welchen Ausgang Sie in diesem Fall wünschen. Möglicherweise möchten Sie die '-' am Ende des letzten Elements z. B. mit .rstrip('-') abschneiden.

>>> from itertools import izip_longest 
>>> s="a-b-c-d-e-f-g-h-i-j-k-l-m" 
>>> i=iter(s.split('-')) 
>>> map("-".join,izip_longest(i,i,fillvalue="")) 
['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l', 'm-'] 

Hier sind einige Timings

$ python -m timeit -s 'import re;r=re.compile("[^-]+-[^-]+");s="a-b-c-d-e-f-g-h-i-j-k-l"' 'r.findall(s)' 
100000 loops, best of 3: 4.31 usec per loop 

$ python -m timeit -s 'from itertools import izip;s="a-b-c-d-e-f-g-h-i-j-k-l"' 'i=iter(s.split("-"));["-".join(x) for x in izip(i,i)]' 
100000 loops, best of 3: 5.41 usec per loop 

$ python -m timeit -s 's="a-b-c-d-e-f-g-h-i-j-k-l"' 'i=iter(s.split("-"));["-".join(x) for x in zip(i,i)]' 
100000 loops, best of 3: 7.3 usec per loop 

$ python -m timeit -s 's="a-b-c-d-e-f-g-h-i-j-k-l"' 't=s.split("-");["-".join(t[i:i+2]) for i in range(0, len(t), 2)]' 
100000 loops, best of 3: 7.49 usec per loop 

$ python -m timeit -s 's="a-b-c-d-e-f-g-h-i-j-k-l"' '["-".join([x,y]) for x,y in zip(s.split("-")[::2], s.split("-")[1::2])]' 
100000 loops, best of 3: 9.51 usec per loop 
+1

+1 Schön, sauber Lösung ... – ChristopheD

+0

Wow, das ist großartig! – unutbu

+0

Pythonische Eleganz – elzapp

0

Ich denke, einige der bereits genannten Lösungen sind gut genug, aber nur zum Spaß, ich habe diese Version:

def twosplit(s,sep): 
    first=s.find(sep) 
    if first>=0: 
    second=s.find(sep,first+1) 
     if second>=0: 
     return [s[0:second]] + twosplit(s[second+1:],sep) 
     else: 
     return [s] 
    else: 
     return [s] 
    print twosplit("this-is-a-string","-") 
Verwandte Themen