Keresés

Ú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? :F

    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()
    True

    Ha 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 valasz

    A for ciklust mondjuk így is írhatnád:

    for betu in szo:
    if not '0' < betu < '9':
    valasz = False

    Vagy esetleg így:

    import string

    for betu in szo:
    if betu not in string.digits:
    valasz = False

    Update! 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: 20

    Jó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 #502 üzenetére

    Pedig ez a megoldás, csak az a kérdés, hogyan próbáltad pontosan :)

    Én így csinálnám:
    x = [int(i) for i in x]

    De az int/map megoldással is működik:
    x = list(map(int, x))

    A list Python 2.7 alatt nem tudom, hogy kell-e, de Python 3.x-nél biztosan.

  • 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')
    4

    A 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'

  • sonar

    addikt

    válasz XP NINJA #459 üzenetére

    parancsolj
    >>> s = "python"
    >>> list(s)
    ['p', 'y', 't', 'h', 'o', 'n']

  • 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