Kezdőoldal » Számítástechnika » Programozás » Számjegyek cseréje egy számban...

Számjegyek cseréje egy számban, Python?

Figyelt kérdés

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.



2021. nov. 23. 19:49
1 2 3 4
 11/32 anonim ***** válasza:
100%

A #10-es javaslata alapján:

[link]

2021. nov. 23. 23:15
Hasznos számodra ez a válasz?
 12/32 anonim ***** válasza:

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

2021. nov. 24. 01:58
Hasznos számodra ez a válasz?
 13/32 anonim ***** válasza:

#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.

2021. nov. 24. 02:27
Hasznos számodra ez a válasz?
 14/32 anonim ***** válasza:

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]

2021. nov. 24. 03:51
Hasznos számodra ez a válasz?
 15/32 anonim ***** válasza:

Í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...")

-------------------------------------------------------------

2021. nov. 24. 08:04
Hasznos számodra ez a válasz?
 16/32 anonim ***** válasza:
#13: igen, de a feladatban az első és az utolsó számjegyet kell felcserélni
2021. nov. 24. 10:35
Hasznos számodra ez a válasz?
 17/32 anonim ***** válasza:

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]

2021. nov. 24. 10:52
Hasznos számodra ez a válasz?
 18/32 anonim ***** válasza:
#16: Ami kezelhető úgy is, hogy a TELJES számot felcseréljük (a feladat ugyanis nem tér ki arra, hogy csak és kizárólag az első és utolsó számjegyeket kell felcserélni, vagy felcserélhető a teljes szám is - szóval nem tér ki a több számjegyből álló számok esetére).
2021. nov. 24. 11:40
Hasznos számodra ez a válasz?
 19/32 anonim ***** válasza:

#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

2021. nov. 24. 12:17
Hasznos számodra ez a válasz?
 20/32 anonim ***** válasza:

#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.

2021. nov. 24. 12:29
Hasznos számodra ez a válasz?
1 2 3 4

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!