Zamiania miejscami elementów w napisie

0

Witam.
jak można w pythonie zamienić miejscami elementy w napisie, np. z "AX" zrobić "XA".
Próbowałem to zrobić metodą replace():

napis = "AX"
dlugosc = len(napis)
print(napis)
bufor = napis[0]
napis = napis.replace(napis[0],napis[dlugosc-1]).replace(napis[dlugosc-1],bufor)
print(napis)

ale zamiast "XA" otrzymuję "XX". Jest jakiś inny sposób na taką zamianę? Coś jak funkcja swap() tylko że w pythonie.

2

Zauważ, że po pierwszy replace’ie zamieniłeś wszystkie "A" na "X", tego już nie masz w stringu, to drugi replace niczego nie rusza. Najwygodniej Ci będzie skorzystać z str.translatehttps://docs.python.org/3/library/stdtypes.html#str.translate

Ew. poskładać string od nowa: napis[:pierwsze_miejsce] + napis[drugie_miejsce] + napis[pierwsze_miejsce + 1:drugie_miejsce] + napis[pierwsze_miejsce] + napis[drugie_miejsce + 1:]:

napis = "0123456789"
nowy_napis = napis[:4] + napis[7] + napis[5:7] + napis[4] + napis[8:]
assert nowy_napis == "0123756489"

A jak wykonujesz takie operacje często, to dobrym rozwiązaniem zamiast używania niemutowalnego stringa byłoby używanie mutowalnej listy morfemów.

Uwzględnij ew. problemy z Unikodem w tych rozwiązaniach.

2

Zakładając że zawsze będziesz mial dwu literowce to można tak:

a = "AX"
b = f"{a[1]}{a[0]}"
print(b)
# XA
5

Ja bym zrobił to w ten sposób:

napis = "AX"
napis = [::-1]
print(napis)
3
silver1 napisał(a):

Ja bym zrobił to w ten sposób:

napis = "AX"
napis = [::-1]
print(napis)

Tak dla doprecyzowania ;-]

In [14]: s = 'ABCD'
In [15]: print(s[::-1])
DCBA
In [16]: 
4

Trochę słabo wyspecifikowany problem; co zamienić na co?
Zamienić pierwsze wystąpienia danych stringów koło siebie?
Co z dalszymi?
Co w przypadku pustego stringa, stringa bez wystąpień danych znaków, z jednym, dwoma?
Jakie założenia na input, output, etc, etc, etc...

0

Dobra, słuchajcie udało się to zrobić:

napis = input()
dlugosc = len(napis)
print(napis)
nowy_napis = napis[dlugosc-1]
e=2
for i in range(dlugosc-1):
    nowy_napis +=napis[dlugosc-e]
    e+=1
print(nowy_napis)

Jeśli ktoś ma pomysł, jak to uprościć to niech pisze.

0

kixe52 tak przeczytałem, zainspirowało mnie rozwiązanie Althoriona

2

No ja bym to uprościł do mojego rozwiązania, zamiast się tylko nim inspirować… Przy długich napisach ta pętla będzie naprawdę ciążyć.

49

Ale po co kombinujesz? Ta pętla to przerost formy nad treścią. @Althorion pokazał Ci czym jest slicing w pythonie.

0

Tak dla kompletności, wersja z rekursją:

def reverse(s):
    if len(s) == 1:
        return s
    else:
        return reverse(s[1:]) + s[0]

In [1]: reverse('recursion')
Out[1]: 'noisrucer'
In [2]: reverse('There is no spoon')
Out[2]: 'noops on si erehT'

1 użytkowników online, w tym zalogowanych: 0, gości: 1