Számjegyek cseréje egy számban, Python?
Hogyha van egy listám csupa háromjegyű számmal, és azt szeretném, hogy mindegyiknél cserélje fel az utolsó és első számjegyét, azt hogy tudom megcsinálni Pythonban?
Tehát pl van egy ilyen listám:
a=[342, 763, 927]
Ilyet szeretnék kapni:
b=[243, 367, 729]
Valami ilyesmire gondoltam, de tudom, hogy ez egészen sok sebből vérzik:
for i in range(len(a)):
str(a[i])[0] = str(a[i])[2]
str(a[i])
Tudna valaki segíteni? köszönöm szépen.
A #10-es javaslata alapján:
Az eddigi megoldások, amik reverselték a számjegyeket csak 3 jegyü számokra müködnek(meg ha a 'középsö' szájegyek palindromok).
Az általános megoldás, valami olyasmi, hogy ki kell nyerni az elsö számjegyet, az utolsót, valamint azokat, amik az elsö és az utolsó közt van. Ha a stringé konvertálós megoldást akarjuk, akkor viszonylag egyszerü:
Elsö elem: s[0]
utolsó elem: s[-1]
'középsö' elemek: s[1:-1]
>> s = str(1234)
>> int(s[-1] + s[1:-1] + s[0])
4231
persze ez csak akkor müködik, ha a szám legalább két számjegyü. A függvényben, ami ezt a müveletet csinálja, majd kell egy kitétel, hogy egyszámjegyü számoknál csak adja vissza a paraméterét.
A numerikus megoldásnál egy kicsit trükkösebb:
Az utolsó számjegyet megkapjuk, ha csinálunk egy maradékképzést 10-el:
last_digit = n % 10
Az elsö(legnagyobb helyi értékü) számjegyhez osztanunk kell a számot:
2 jegyü számok esetén 10-el.
3 jegyü számok esetén 100-al.
4 jegyü számok esetén 1000-el stb...
látjátok a mintát? Az osztó, amivel megkapjuk az elsö számjegyet a 10 (szamjegyek_szama - 1). hatványa. Mostmár csak azt kéne kideríteni, hogy hány számjegyböl áll a szám. Ha figyeltél matematika órán, akkor eszedbe juthat most, hogy a 10-es alapú logaritmus pont jó erre:
>> from math import log
>> n = 4321
>> log(n, 10)
3.6355...
Ezt felfele kerekítve megkapjuk a számjegyek számát, de nekünk úgyis az egyel kissebb fog kelleni, szóval kerekítsük lefele.
>> from math import log
>> n = 4321
>> divisor = 10**int(log(n, 10))
>> int(n/divisor)
4
Mostmár van módszerünk az elsö és az utolsó számjegy meghatározására, mostmár csak a 'közepe' kell. Ez innen már nem bonyolult:
Az a szám, amivel elöbb osztottunk, ha most maradékot képzünk, megadja az elsö számjegyen kívül fennmaradó számjegyeket:
>> n % divisor
321
ez már majdnem jó, de még az utolsó számjegyet le kéne róla szedni. Ha elosztjuk 10-el meg is vagyunk
>> int((n % divisor) / 10)
32
Ezek után csak újra össze kell rakni a számot, de most az elsö számjegy helyett az utolsót, az utolsó helyett az elsöt. A müvelet ugyanaz, mint ahogy szétszedtük, csak invertálva.
Ezeket összerakva:
>> from math import log
>> n = 4321
>> last_digit = n % 10
>> divisor = 10**int(log(n, 10))
>> first_digit = int(n/divisor)
>> middle_digits = int((n % divisor) / 10)
>> last_digit * divisor + middle_digits*10 + first_digit
1324
Itt van a végleges kód, ha valakit érdekel: [link]
Az hogy a lista minden elemére megcsinálja, az már triviális
#12: "Az eddigi megoldások, amik reverselték a számjegyeket csak 3 jegyü számokra müködnek"
A #7, #8 és #11-es hozzászólásaimban bemutatott módszerek bármekkora szám esetén megcserélik a TELJES szám sorrendjét.
Az én megoldásom a következő. A számjegyek bármilyen hosszúságuak lehetnek.
-------------------------------------------------------------
print("working...")
numbers = [342,25,2345,763,927,4795,36,95,392,32]
reverse = []
lenNumbers = len(numbers)
for n in range(lenNumbers):
strn = str(numbers[n])
lenStrn = len(strn)
chStart = strn[0]
chEnd = strn[lenStrn-1]
st = strn[1:-1]
strEnd = int(chEnd + st + chStart)
reverse.append(strEnd)
print(reverse)
print("done...")
-------------------------------------------------------------
output:
[243, 52, 5342, 367, 729, 5794, 63, 59, 293, 23]
Íme a formázott kód:
-------------------------------------------------------------
print("working...")
numbers = [342,25,2345,763,927,4795,36,95,392,32]
reverse = []
lenNumbers = len(numbers)
for n in range(lenNumbers):
____strn = str(numbers[n])
____lenStrn = len(strn)
____chStart = strn[0]
____chEnd = strn[lenStrn-1]
____st = strn[1:-1]
____strEnd = int(chEnd + st + chStart)
____reverse.append(strEnd)
print(reverse)
print("done...")
-------------------------------------------------------------
Szerintem azokat cseréli fel.
input = [342,25,2345,763,927,4795,36,95,392,32]
output = [243, 52, 5342, 367, 729, 5794, 63, 59, 293, 23]
#17: igen, a tiéd müködik, a #13-nak válaszoltam, aki a #7, #8, #11 válaszokban szereplö megoldásokra írta, hogy hosszabb számokat is megfordít.
De neked is akartam írni a megoldásoddal kapcsolatban(#13):
Az elsö észrevételem, hogy a lenStrn-t feleslegesen hozod létre. Arra használod, hogy az utolsó számjegy indexét meghatározd(lenStrn - 1), de erre pythonban a -1 index való:
chEnd = strn[-1]
A másik észrevétel, ezt már több válaszodban is láttam, az ez:
lista = [...]
for i in range(len(lista)):
____elem = lista[i]
Ez a konstrukció ugyan müködik, de ez nem idiomatikus python. A python idióma így néz ki helyesen:
for elem in lista:
____...
Még van itt egy harmadik dolog is. Tudom, hogy most tanulod a pythont, úgyhogy a figyelmedbe ajánlom ezt a dokumentumot: [link]
Ez a python hivatalos 'style-guide'-ja. Ebben van egy rész, ami a változók és függvények elnevezésével kapcsolatos( [link] #function-and-variable-names). Ez kimondja, hogy a változóidat snake_case-ben kell elnevezni(te camelCase-t használsz). Tehát például a chStart helyett ch_start, a strEnd helyett str_end a 'helyes' változónév.
Ezt a dokumentumot érdemes lehet átlapozgatni, de vannak eszközök, amik át tudják nézni a kódodat és szólnak, ha valamit nem a style guide szerint csinálsz. Ezt a két csomagot installáld fel: flake8, pep8-naming
Ezek után, ha írsz egy python kódot, futtasd rá a flake8-at. Ez ki fogja listázni a problémákat:
Valahogy így néz ki, ha pl lefuttatod a #15-ben írt kódodra:
$ python3 -m flake8 formazott.py
formazott.py:3:15: E231 missing whitespace after ','
numbers = [342,25,2345,763,927,4795,36,95,392,32]
^
...
formazott.py:7:2: N816 variable 'lenNumbers' in global scope should not be mixedCase
lenNumbers = len(numbers)
^
...
formazott.py:17:25: E226 missing whitespace around arithmetic operator
chEnd = strn[lenStrn-1]
^
...
1 E226 missing whitespace around arithmetic operator
9 E231 missing whitespace after ','
5 N816 variable 'lenNumbers' in global scope should not be mixedCase
#19 Köszönöm szépen a tippeket, igen hasznosak, megpróbálom alkalmazni őket.
Én még kezdő vagyok a Pythonban, de azt hiszem, hogy szorgalmas és kitartó vagyok.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!