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?
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?
oneliner:
>>> s = 'badcfe'
>>> ''.join([ s[x:x+2][::-1] for x in range(0, len(s), 2) ])
'abcdef'
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'
>>>
gibt es ein 's' in deinen Argumenten und kein 's' in deinem Körper! in einer Bearbeitung behoben. – Spacedman
s = '2143' nicht '2134' benutzt undefined var c – cocobear
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. –
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.
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.
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'
ValueError für ungerade len (s)? –
Leider funktioniert nicht auf ungleich langen Saiten. –
Paulo oder Fabian, was würdest du mit ungültiger Eingabe machen wollen, außer eine Ausnahme zu werfen? – Duncan
''.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.
für ungerade len (s) der erste gibt 'IndexError: String-Index außerhalb des Bereichs ', der zweite hackt letzten char. –
@paulo: und was ist die OP-Anforderungen für die Strings der ungeraden Länge? – SilentGhost
@Paulo Scardine: Du hast Recht, aber die Frage war nicht spezifisch genug. –
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'
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"))
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
Wird dies in der Anwendung nicht extrem eingeschränkt sein? –
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
Was ist, wenn die Saite eine ungerade Länge hat? –
Eine weitere Möglichkeit:
>>> s='123456'
>>> ''.join([''.join(el) for el in zip(s[1::2], s[0::2])])
'214365'
>>> 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
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
#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)
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. –
Srsly, nicht schon wieder. – gruszczy
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
Down gewählt, um die gleiche Frage erneut zu stellen. * seufz * – clifgriffin