2011-01-05 12 views
13

Ich möchte jedes Zeichenpaar in einer Zeichenfolge austauschen. '2143' wird '1234', 'badcfe' wird 'abcdef'.Was ist der einfachste Weg, um char in einer Zeichenfolge mit Python zu tauschen?

Wie kann ich das in Python tun?

+0

Srsly, nicht schon wieder. – gruszczy

+2

Zumindest das q ist jetzt klar. Obwohl es klarer wäre, wenn die ursprüngliche Zeichenfolge "Foobar" und das Ergebnis "Ofbora" wäre, sieht es immer noch nach Sortierung aus, aber jetzt wissen wir, dass es nicht ist! – Spacedman

+1

Down gewählt, um die gleiche Frage erneut zu stellen. * seufz * – clifgriffin

Antwort

13

oneliner:

>>> s = 'badcfe' 
>>> ''.join([ s[x:x+2][::-1] for x in range(0, len(s), 2) ]) 
'abcdef' 
  • s [x: x + 2] gibt String slice von x bis x + 2; es ist sicher für ungerade len (s).
  • [:: - 1] kehrt die Zeichenfolge in Python um
  • Bereich (0, len (s), 2) gibt 0, 2, 4, 6 ... zurückwährend x < len (s)
1

Hier ist eine Art und Weise ...

>>> s = '2134' 
>>> def swap(c, i, j): 
... c = list(c) 
... c[i], c[j] = c[j], c[i] 
... return ''.join(c) 
... 
>>> swap(s, 0, 1) 
'1234' 
>>> 
+0

gibt es ein 's' in deinen Argumenten und kein 's' in deinem Körper! in einer Bearbeitung behoben. – Spacedman

+1

s = '2143' nicht '2134' benutzt undefined var c – cocobear

+1

Das tauscht nur das erste Zeichen aus, und wenn Sie dann alles austauschen wollen, müssen Sie die Zeichenfolge teilen und der Zeichenfolge für len (s)/2 mal beitreten. –

0

Haben Sie die Ziffern wollen sortiert? Oder tauschen Sie ungerade/gerade indexierte Ziffern aus? Ihr Beispiel ist völlig unklar.

Sortieren:

s = '2143' 
p=list(s) 
p.sort() 
s = "".join(p) 

s ist jetzt '1234'. Der Trick ist hier, dass die Liste (Zeichenfolge) es in Zeichen aufteilt.

+1

Als eine Anmerkung, es ist prägnanter, nur '' '.join (sortierte (s)) 'und genauso klar. –

+0

Entschuldigung dafür. Ich möchte alle zwei Zeichen in der Zeichenfolge austauschen. – cocobear

+0

Ich vergesse immer sortiert (x)! Danke. – Spacedman

1

Schleife über die Länge der Zeichenfolge von Zweien und swap:

def oddswap(st): 
    s = list(st) 
    for c in range(0,len(s),2): 
     t=s[c] 
     s[c]=s[c+1] 
     s[c+1]=t 

    return "".join(s) 

geben:

>>> s 
'foobar' 
>>> oddswap(s) 
'ofbora' 

und nicht auf ungeradee Zeichenfolge der Länge mit einer Indexerror Ausnahme.

6

Der üblicher Weg, um Elemente in Python zu tauschen ist:

a, b = b, a 

Es wäre so scheint mir, dass Sie nur mit einer erweiterten Scheibe das gleiche tun. Es ist etwas kompliziert, weil Strings nicht wandelbar sind, so dass Sie auf eine Liste konvertieren und dann zurück in einen String, aber was ich tun würde, ist:

>>> s = 'badcfe' 
>>> t = list(s) 
>>> t[::2], t[1::2] = t[1::2], t[::2] 
>>> ''.join(t) 
'abcdef' 
+1

ValueError für ungerade len (s)? –

+1

Leider funktioniert nicht auf ungleich langen Saiten. –

+0

Paulo oder Fabian, was würdest du mit ungültiger Eingabe machen wollen, außer eine Ausnahme zu werfen? – Duncan

2
''.join(s[i+1]+s[i] for i in range(0, len(s), 2)) # 10.6 usec per loop 

oder

''.join(x+y for x, y in zip(s[1::2], s[::2])) # 10.3 usec per loop 

oder wenn die Zeichenfolge kann eine ungerade Länge haben:

''.join(x+y for x, y in itertools.izip_longest(s[1::2], s[::2], fillvalue='')) 

Beachten Sie, dass dies nicht mit alten Versionen von Python arbeiten (wenn ich nicht bin zu verkennen olde r als 2,5). Der Benchmark wurde auf Python-2.7-8.fc14.1.x86_64 und einer Core 2 Duo 6400 CPU mit s=''*4 ausgeführt.

+1

für ungerade len (s) der erste gibt 'IndexError: String-Index außerhalb des Bereichs ', der zweite hackt letzten char. –

+1

@paulo: und was ist die OP-Anforderungen für die Strings der ungeraden Länge? – SilentGhost

+0

@Paulo Scardine: Du hast Recht, aber die Frage war nicht spezifisch genug. –

0

wie folgt:

>>> s = "2143658709" 
>>> ''.join([s[i+1] + s[i] for i in range(0, len(s), 2)]) 
'1234567890' 

>>> s = "badcfe" 
>>> ''.join([s[i+1] + s[i] for i in range(0, len(s), 2)]) 
'abcdef' 
0
re.sub(r'(.)(.)',r"\2\1",'abcdef1234') 

jedoch wieder ist ein bisschen langsam.

def swap(s): 
    i=iter(s) 
    while True: 
     a,b=next(i),next(i) 
     yield b 
     yield a 

''.join(swap("abcdef1234")) 
2

Wenn die Leistung oder Eleganz ist nicht ein Problem, und Sie wollen einfach nur Klarheit und haben den Job dann einfach getan verwenden:

def swap(text, ch1, ch2): 
    text = text.replace(ch2, '!',) 
    text = text.replace(ch1, ch2) 
    text = text.replace('!', ch1) 
    return text 

Auf diese Weise können Sie tauschen oder einfach Zeichen oder Teilkette ersetzen. Zum Beispiel tauschen 'ab' < -> 'de' in einem Text:

_str = "abcdefabcdefabcdef" 
print swap(_str, 'ab','de') #decabfdecabfdecabf 
+2

Wird dies in der Anwendung nicht extrem eingeschränkt sein? –

2

Es besteht keine Notwendigkeit, eine Liste zu machen. Die folgenden Arbeiten für selbst langen Strings:

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

Was ist, wenn die Saite eine ungerade Länge hat? –

0

Eine weitere Möglichkeit:

>>> s='123456' 
>>> ''.join([''.join(el) for el in zip(s[1::2], s[0::2])]) 
'214365' 
0
>>> import ctypes 
>>> s = 'abcdef' 
>>> mutable = ctypes.create_string_buffer(s) 
>>> for i in range(0,len(s),2): 
>>>  mutable[i], mutable[i+1] = mutable[i+1], mutable[i] 
>>> s = mutable.value 
>>> print s 
badcfe 
0
def revstr(a): 
    b='' 
    if len(a)%2==0: 
     for i in range(0,len(a),2): 
      b += a[i + 1] + a[i] 
     a=b 
    else: 
     c=a[-1] 
     for i in range(0,len(a)-1,2): 
      b += a[i + 1] + a[i] 
     b=b+a[-1] 
     a=b 
    return b 
a=raw_input('enter a string') 
n=revstr(a) 
print n 
-1
#Works on even/odd size strings 
str = '2143657' 
newStr = '' 
for i in range(len(str)//2): 
    newStr += str[i*2+1] + str[i*2] 
if len(str)%2 != 0: 
    newStr += str[-1] 
print(newStr) 
+0

Willkommen bei Stack Overflow! Während dieses Code-Snippet die Frage lösen kann, einschließlich einer Erklärung von * wie * und * warum *, löst dies das Problem [würde wirklich helfen] (// meta.stackexchange.com/q/114762), um die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, nicht nur die Person, die jetzt fragt! Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung hinzuzufügen und geben Sie an, welche Einschränkungen und Annahmen gelten. –

Verwandte Themen