Python - 9. lekce - sort() – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Python - 9. lekce - sort() – Python – Fórum – Programujte.comPython - 9. lekce - sort() – Python – Fórum – Programujte.com

 

Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
23. 9. 2017   #1
-
0
-

Ahoj zacal jsem se ucit Python a jedu podle vasich lekci...

narazil jsem tu na jeden problem a nevim proc to tak je(v dokumentaci jsem nic nenasel http://python-reference.readthedocs.io/…st/sort.html#id1)

Tenhle program funguje:


telSeznam = [["Zdenek",1111111], ["Lucka",2222222], ["Ctirad",3333333]]

print(telSeznam)

def porovnej(telSeznam):

    return telSeznam[1]

telSeznam.sort(key=porovnej)

print(telSeznam)

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

Takhle bohuzel nefunuje. Muzete mi nekdo rict proc? Dekuji mockrat


telSeznam = [["Zdenek",1111111], ["Lucka",2222222], ["Ctirad",3333333]]

print(telSeznam)

telSeznam.sort(key=telSeznam[1])

print(telSeznam)
 

Nahlásit jako SPAM
IP: 2a00:1028:8d1c:57f6:20f1:...–
gna
~ Anonymní uživatel
411 příspěvků
23. 9. 2017   #2
-
0
-

Parametr key určuje funkci, která vrací hodnotu, která se má použít při porovnávání. Při tom řazení se pak ta funkce postupně volá pro jednotlivé položky a podle té hodnoty se ty položky seřadí.

Myslím, že je to dost jasné v tom článku i dokumentaci. Možná trochu srozumitelnější verze by bylo takto: 

def pocetObyvatel(mesto):
    return mesto[1]  # počet obyvatel

seznamMest=[['Praha', 1000000], ['Brno', 350000], ...]
seznamMest.sort(key=pocetObyvatel)  # serad podle klice (= funkce) "pocetObyvatel"

V té druhé variantě místo funkce dáváš přímo položku seznamu, se kterou to nic nenadělá.

Nahlásit jako SPAM
IP: 213.211.51.–
23. 9. 2017   #3
-
0
-

#2 gna
Dekuji, ale tady tomu rozumim jen nechapu, proc se to musi delat pres funkci ktera vraci: mesto[1]

a nemohu ji prach proste napsat: seznamMest.sort(key=mesto[1]).

Navic ta fuknce u parametru key je bez kulatych zavorek.

Do ted jsem vse chapal ale ted jsem v lese.

 

Nahlásit jako SPAM
IP: 2a00:1028:8d1c:57f6:20f1:...–
gna
~ Anonymní uživatel
411 příspěvků
24. 9. 2017   #4
-
0
-

Parametr key určuje funkci, která vrací hodnotu, která se má použít při porovnávání. Při tom řazení se pak ta funkce postupně volá pro jednotlivé položky a podle té hodnoty se ty položky seřadí.

Co víc k tomu napsat? Chceš, aby se použila funkce pocetObyvatel, tak tam dáš pocetObyvatel.

mesto[1] není funkce, ale hodnota ze seznamu mesto -- což by klidně mohla být funkce, ale není -- je to číslo. Co by ten sort měl s tímhle dělat?

seznamMest=[['Praha', 1000000], ...]
prvniMesto = seznamMest[0] # prvniMesto = ['Praha', 1000000]
seznamMest.sort(key=prvniMesto[1]) # key = 1000000
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
411 příspěvků
24. 9. 2017   #5
-
0
-

   

def pocetObyvatel(mesto):
    print('pro tohle', mesto)
    print('   vracim', mesto[1])
    return mesto[1]
    
def serad_dva(seznam, key):
    polozka0 = seznam[0]
    polozka1 = seznam[1]

    # az tady se funkce zadana jako key podle potreby vola
    hodnota0 = key(polozka0)
    hodnota1 = key(polozka1)

    # a podle vracene hodnoty se polozky seradi
    if hodnota0 < hodnota1:
        return [polozka0, polozka1]
    else:
        return [polozka1, polozka0]

seznamMest=[['Praha', 1000000], ['Brno', 350000]]

print('== original', seznamMest)
print('=> serazeno', serad_dva(seznamMest, pocetObyvatel))
== original [['Praha', 1000000], ['Brno', 350000]]
pro tohle ['Praha', 1000000]
   vracim 1000000
pro tohle ['Brno', 350000]
   vracim 350000
=> serazeno [['Brno', 350000], ['Praha', 1000000]]
Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
2919 příspěvků
26. 9. 2017   #6
-
0
-

http://python-reference.readthedocs.io/en/latest/docs/list/sort.html#id1

list. sort([cmp[, key[, reverse]]])

cmp - je compare funkce, typ sort funkce. Sort ma v sobe zabudovany nejaky algoritmus, ktery porovnava 2 hodnoty a sotrebuje zjistit, ktera je vetsi, mensi, rovna, podle toho vykonava cast algoritmu 1 nebo 2 nebo 3. Pouziju javascriptovy zapis, python moc nepouzivam.

function cmpNum(a,b)
{
if (a>b) {return 1;}
if (a<b) {return -1;}
return 0; // a==b
}

function cmpStr(a,b)
{
if (len(a)-len(b)) {return cmpNum(a,b);}
else return {cmpNum(len(a),len(b))}
}
// jakoze u stringu je rychlejsi porovnat delku a az pak resit porovnani treba 1000 znaku s 1000 znaky, takze, abys sortovani urychlil, pouzijes vlastni funkci

function cmpX(a,b)
{
if (a[0]>b[0]) {return 1;}
if (a[0]<b[0]) {return -1;}
return 0; // a[0]==b[0]
}
// pole, ktere pro sort ted pouzivam, je dvourozmerne (tabulka) a chces porovnavar prvni sloupec a ostatni te nezajimaji
// je mozne napsat cmp i pro porovnani vice sloupcu, neco jako sql ORDER BY. Tohle ovsem defaultni sort nemuze vedet, jake sloupce chces sortovat podle jakych pravidel

list.sort()
list.sort(cmpNum)
list.sort(cmpStr)
list.sort(cmpX)

A treba budes chtit specialitku, potrebujes aby prvnich 5 vysledku ze seznamu mest byla praha, brno, ostrava, plzen, pardubice. To ten sort take nemuze vedet, proto si napises vlastni sort funkci a nebo to po sortovani upravis.
Jestli gna chapu spravne, tak pythonove sort ma asi tu moznost nastavit prvni key (v jinych jazycich to neni), sloupec pro serazovani tabulky. Coz je sice cool, ale nevim, zda by se tam dalo napsat vic sloupcu. Jako serad podle veku, prijmeni, jmena. Kdyz ne, zas bys musel napsat vlastni cmp funkci.

Mno, a obcas je treba napsat vlastni sort, protoze treba pro bzip potrebujes serazovaci algoritmus, ktery, kdyz porovnava dve stejne hodnoty, tak je nesmi prehodit.Coz treba quick-sort ne tak uplne splnuje. Aspon nekdy jsem cetl, ze vetsinou se pro sort pouziva quicksort.

Nahlásit jako SPAM
IP: 2001:718:2601:258:8d34:99...–
peter
~ Anonymní uživatel
2919 příspěvků
26. 9. 2017   #7
-
0
-

u cmpX(a,b), se jako parametry a,b predavaji cela pole
pole = [
['praha', 1.000.000], => a
['brno', 200.000], => b
]
Takze, pokud chces porovnavat pocet obyvatel, tak do te funkce musis dat a[1] a b[1]. Pokud nazvy mes, tak a[0] a b[0].

Nahlásit jako SPAM
IP: 2001:718:2601:258:8d34:99...–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý