Új hozzászólás Aktív témák
-
cousin333
addikt
válasz
XP NINJA #586 üzenetére
Ez meg milyen leíró nyelv?
Azt kérdezted, én hogyan írnám meg. A válasz: sehogy, mert minek újra feltalálni a kereket, amikor van erre jó kis gyári függvény. Pl:
>>> szo1 = "Valami szöveg 123"
>>> szo1.isdigit()
False
>>> szo2 = "536 25"
>>> szo2.isdigit()
False
>>> szo3 = "53625"
>>> szo3.isdigit()
TrueHa viszont hűek akarunk lenni a példához - a Python nyelv elvárásain belül - akkor ezt írnám:
def szam_e(szo):
valasz = True
for betu in szo:
if betu < '0' or betu > '9':
valasz = False
return valaszA for ciklust mondjuk így is írhatnád:
for betu in szo:
if not '0' < betu < '9':
valasz = FalseVagy esetleg így:
import string
for betu in szo:
if betu not in string.digits:
valasz = FalseUpdate! Egy kis adalék: a saját megoldások futtatási ideje sorrendben 1,41, 1,61 és 1,55 us (mikroszekundum), ellenben a gyári függvénnyel 53,9 ns (nanoszekundum). Utóbbi tehát úgy 26-szor gyorsabb...
-
cousin333
addikt
válasz
XP NINJA #576 üzenetére
Szintén kerekíteni kell, de azt csak tizedesjegyekre lehet. A megoldás szerintem, ha ideiglenesen megduplázod a számot, tízesekre kerekítesz, majd kettővel osztasz (jobbra shifttel, mert a sima osztásnak nem biztos, hogy egész szám az eredménye). Példa:
In [9]: def kerekit(x):
...: return round(2*x, -1) >> 1
...:
In [10]: for i in range(20):
....: print('{}: {}'.format(i, kerekit(i)))
....:
0: 0
1: 0
2: 0
3: 5
4: 5
5: 5
6: 5
7: 5
8: 10
9: 10
10: 10
11: 10
12: 10
13: 15
14: 15
15: 15
16: 15
17: 15
18: 20
19: 20Jónak tűnik...
-
csaszizoltan
csendes tag
válasz
XP NINJA #573 üzenetére
Szia!
https://wiki.python.org/moin/HowTo/Sorting
Speciel a Key Functions fejezet alatt:console
>>> student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
>>> sorted(student_tuples, key=lambda student: student[2]) # kor szertint rendezve
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_tuples, key=lambda student: student[1]) # nagybetű szerint rendezve # and by me
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(student_tuples, key=lambda student: student[0]) # név szerint rendezve # and by me
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]csak a tuples-ek helyett Nálad kis listák vannak, azon belül egy elemre hivatkozás ugyanúgy történik.
Az itt felhasznált lambda függvény különösebb értése illetve magyarázata nélkül javaslom. -
cousin333
addikt
válasz
XP NINJA #512 üzenetére
1. kérdés
A Python lista nem igazán erre való, de van egy elegáns, bár nem triviális megoldás a problémára, ami megvillant valamit a Python tudásából
:
szamok = list(range(90)) # A 90 számból álló lista
sor = 6
elem = 15
# tuple-k listája
felosztva = list(zip(*[iter(szamok)] * elem))
# listák listája
felosztva = [list(i) for i in zip(*[iter(szamok)] * elem)]Ha valaki nagyon tömbökkel/mátrixokkal akar szórakozni, akkor mindenképpen a numpy modul ajánlott. Ez a tudományos területen a Python-használat alfája és omegája, viszont nem része az alap Python telepítésnek. Ebben pl. van reshape függvény, ami pont erre való, igaz azt nem listákon, hanem a speciálisabb ndarray tömbökön lehet végrehajtani.
2. kérdés
Erre alapvetően a datetime modul datetime objektuma való, de az dátumot is vár, nem csak órát meg percet. Furcsamód a time objektum nem támogatja a kivonást. Példának ott az #509-es hozzászólásom.
3. kérdés
Ez két lépés. Az első, hogy bizonyos karaktereket le kell cserélni. Ehhez létre kell hozni egy hozzárendelést, ami megmondja, hogy mit mire kell cserélni, majd el kell végezni a cserét. Nem tudom, hogy van-e egyszerűbb módszer.
>>> szoveg = "Árvíztűrő tükörfúrógép"
>>> trans = str.maketrans("áéíöüóőúűÁÉÍÖÜÓŐÚŰ", "aeiouoouuAEIOUOOUU")
>>> szoveg.translate(trans)
'Arvizturo tukorfurogep'Az angol karakterkészlet a string modulban szerepel:
>>> import string
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'Ebből az eltávolitás valahogy így megy:
>>> szoveg = "Szoveg,-amit meg?:akarunk#szurni"
>>> szurt = [i for i in szoveg if i in string.ascii_letters or i in " "]
>>> szurt = "".join(szurt)
>>> szurt
'Szovegamit megakarunkszurni' -
-
cousin333
addikt
válasz
XP NINJA #498 üzenetére
Természetesen nem baj, ha tisztában vagy a kétdimenziós listákkal is, sok feladatnál kellhet ilyesmi. Arra emlékeztetnélek, hogy a Python nyelvben a sztring maga is iterable, azaz indexelhető, kereshető, mintha egy lista lenne. Pl.
>>> a = "Valami"
>>> a[2]
'l'
>>> a[-1]
'i'
>>> a.find('m')
4A lényeg, hogy gyakran feleslegesen bonyolult a sztringet karakterek listájává vagdosni. Ilyen értelemben a fenti példához első ránézésre nem kétdimenziós lista, hanem sztringek egyszerű (soronkénti) listája kell. Valami hasonlóra példa #453-as hozzászólásomban lévő megoldás.
-
cousin333
addikt
válasz
XP NINJA #496 üzenetére
Amikor a split-tel felosztottad a sort, és kaptál egy listát, azt ne append-del add hozzá a már meglévő listádhoz, hanem extend-del. Példa a különbségre:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a.append(b)
>>> a
[1, 2, 3, [4, 5, 6]]
>>> a = [1,2,3]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6] -
cousin333
addikt
válasz
XP NINJA #459 üzenetére
sonar megoldása jó, de mivel a Pythonban a sztring iterable, egy sima for ciklussal végig lehet menni rajta. Ezért nem hiszem, hogy mindenáron listát kell csinálni belőle.
Ha pedig sztring, akkor a függvények a Python string metódusok.
Pl. sonar példájával élve ez is működik:
>>> s = "python"
>>> s[3]
'h' -
cousin333
addikt
válasz
XP NINJA #452 üzenetére
"Nem törekszem a legeslegegyszerűbb módra, annak szerintem még nincs itt az ideje, de ezt én is túlzásnak érzem."
Szerintem a Python nyelv egyik legjobb tulajdonsága, hogy alapból egyszerű és logikus szerkezeteket használ. Teljesen felesleges elbonyolítani a dolgokat, érdemes egyből az egyszerűre rámenni.
Ami a megoldásodat illeti, az első feladatban két fájlt is be kéne olvasni, nem csak a foglaltsag.txt-t. A 4. feladat sem jó, mert nem az a kérdés, hogy melyik kategóriájú székből van a legtöbb, hanem hogy melyikből adták el a legtöbbet. Ehhez viszont valahol fel kéne használni a lista nevű listádat, ami sehol nem szerepel.
Az én megoldásom alább látható. Nem ellenőriztem le valós adatokkal és azt sem állítom, hogy nem létezik szebb vagy egyszerűbb megoldás a problémákra. Most ennyire tellett:
print("1. feladat")
def fajl_beolvasas(fajlnev):
with open(fajlnev, 'r') as f:
adat = [sor.strip('\n') for sor in f]
return adat
fog_lista = fajl_beolvasas("foglaltsag.txt")
kat_lista = fajl_beolvasas("kategoria.txt")
print("2. feladat")
def foglaltsag_ellenorzes(lista, sor, szek):
if lista[sor][szek] == "x":
return True
else:
return False
sor = int(input("A sor szama? "))
szek = int(input("A szek szama? "))
if foglaltsag_ellenorzes(fog_lista, sor, szek):
print("A szek mar foglalt")
else:
print("A szek meg ures")
print("3. feladat")
# Összefűzzük a foglaltságokat egyetlen sztringbe, hogy egyszerűbb legyen számolni
fog_sztring = "".join(fog_lista)
# Az alábbi formázás automatikusan egész százalékokat ír ki
uzenet = "Eddig {} jegyet adtak el, ami a nezoter {:.0%}-a"
foglalt_db = fog_sztring.count("x")
print(uzenet.format(foglalt_db, foglalt_db/len(fog_sztring)))
print("4. feladat")
# Összefűzzük a kategóriákat is egyetlen sztringbe, hogy egyszerűbb legyen számolni
kat_sztring = "".join(kat_lista)
# A kategorizált ülőhelyeket egy szótárba (dictionary) tesszük. Elsőre mind üres.
kategorizalt = {"1": 0, "2": 0, "3": 0, "4": 0, "5": 0}
# Végigmegyünk a foglaltsági fájlon, és megszámoljuk a foglalt kategorizált üléseket
for i, fogl in enumerate(fog_sztring):
if fogl == "x":
kateg = kat_sztring[i] # A kategória neve, ami a kategoria.txt fájlban volt
kategorizalt[kateg] += 1
legtobb = max(kategorizalt, key=kategorizalt.get)
print("A legtobb jegyet a {} kategoriaban adtak el".format(legtobb))
print("5. feladat")
arak = {"1": 5000, "2": 4000, "3": 3000, "4": 2000, "5": 1500}
bevetel = 0
for kat in kategorizalt:
bevetel += kategorizalt[kat] * arak[kat]
print("A pillanatnyi bevetel: {}Ft".format(bevetel))
print("6. feladat")
egyedul = 0
for sor in fog_lista:
# Ha a sor elején van egy egyedülálló üres hely
if sor.startswith("ox"):
egyedul += 1
# Ha a sor végén van egy egyedülálló üres hely
if sor.endswith("xo"):
egyedul += 1
# Ha a soron belül vannak egyedülálló üres helyek
egyedul += sor.count("xox")
print("A nezoteren jelenleg {} egyedulallo ures hely van".format(egyedul))
print("7. feladat")
sum_lista = []
for i, sor in enumerate(fog_lista):
sum_sor = []
for j, szek in enumerate(sor):
if szek == "x":
sum_sor.append("x")
else:
sum_sor.append(kat_lista[i][j])
sum_lista.append(sum_sor)
with open("szabad.txt", "w") as f:
[f.write(line + '\n') for line in sum_lista] -
cousin333
addikt
válasz
XP NINJA #446 üzenetére
Így első blikkre azért nem működött a második feladatod a függvényes módszerrel, mert nem is hívtad meg. A végén feladat_2 helyett feladat_2()-t kellett volna írni.
Szerintem egyébként mindkét megoldás lehet jó, bár az ilyen egymásra épülő feladatoknál talán nagyobb "érettséget" sugall egy harmadik módszer: a kettő kombinációja. Ilyenkor folyamatosan adod hozzá a függvényeket, amik egy jól meghatározott funkciót hajtanak végre, ami nem feltétlenül esik egybe a (teljes) kiírásbeli feladattal. Ezeket pedig egy "fő programban" hívogatod meg szükség szerint.
A példádban ott a 2. feladat, ami annak eldöntése, hogy foglalt-e egy hely, vagy sem. Ebből készíthetnél egy foglaltsag_ellenorzes(lista, x, y) nevű függvényt, ami csak annyit csinál, hogy megnézi a lista-t, hogy az x, y hely foglalt-e (igen/nem), majd a feladathoz kapcsolódva megcsinálod a "körítést". Pl:
def foglaltsag_ellenorzes(lista, sor, szek):
if lista[sor][szek] == "x":
print("A szek foglalt")
else:
print("A szek ures")
# 2. feladat
sorszam = int(input("Adja meg a sor szamat: "))
szekszam = int(input("Adja meg a szek szamat: "))
foglaltsag_ellenorzes(lista, sorszam-1, szekszam-1)Ha már egyszer elkészült egy függvény, vagy megvan egy adat, akkor azt nem kell ismételni. Mondjuk a hármas példában feleslegesen olvasod be újra a foglaltsag.txt fájlt, hiszen azt már az első feladatnál megtetted. De ahhoz is lehetne egy sima fajl_beolvasas(fajlnev) függvényed, aminek csak a fájl listába olvasása lenne a dolga.
Két további megjegyzés a beolvasáshoz: jobb lenne mindezt a with kifejezéssel megtenni, ami automatikusan zárja is a fájlt. A másik, hogy szerintem felesleges a sorokat is külön listaelemekre bontani, hiszen egy-egy sor az tulajdonképpen egy sztring, ami eleve karakterenként indexelhető. Pl.:
def fajl_beolvasas(fajlnev):
with open(fajlnev, "r") as f:
lista = [line.strip() for line in f]
return lista
lista = fajl_beolvasas("foglaltsag.txt")
Új hozzászólás Aktív témák
Hirdetés
- Gyakorlatilag új, GARANCIÁLIS (2026.12.23-ig!) Asus ROG Strix G16 (G614JV) gamer laptop RTX 4060-nal
- Switch OLED piros-kék, 2025. novemberig Alza garis, dobozával és minden tartozékkal
- Eladó! MSI mag 360r-v2 komplett cpu hűtő (Csomagküldés az árban)+vezérlő
- NEOS BAZÁR számtek kellékek, kábelek, tartozékok, egerek
- Focal Chorus 726
- Dell P2419H P2419Hc Full HD LED IPS 24" + P2719H 27" LCD monitor (vékony keretes)
- Dixit 4 Eredet (bontatlan, fóliás kártyacsomag)
- Kingmax 2x2GB DDR3 1333 RAM eladó
- Update 06.30. Bomba árak 2025-ben is! Üzleti - Consumer laptopok DELL FUJITSU HP LENOVO
- BESZÁMÍTÁS! Asus TUF B550M R7 5700X 16GB DDR4 512GB SSD RTX 3060 Ti 8GB Rampage SHIVA FSP 700W
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest