Zapisz jako PDF
Transkrypt
Zapisz jako PDF
W poprzednim rozdziale przedstawione były struktury danych zawierające elementy w pewnym określonym porządku — listy, krotki, napisy. W przypadku struktur danych takich jak słowniki czy zbiory elementy nie mają określonej kolejności. Nie znaczy to, że nie można wykonać operacji dla każdego elementu zbioru jak dla zwykłej sekwencji, tylko że kolejność elementów w zbiorze nie jest dobrze określona. Spis treści 1 Słownik 1.1 Wyjaśnienie dla matematyka 1.2 Jak to działa? 1.3 Słowniki i krotki w przekazywaniu argumentów w wywołaniu funkcji 1.3.1 Przykład 1.4 Dodatkowe zadania i przykłady 2 Zbiór 2.1 Wyjaśnienie dla matematyka 2.2 Jak to działa? 3 Podsumowanie Słownik O słowniku wygodnie jest myśleć jako o nieposortowanym zbiorze par klucz:wartość, przy czym klucz musi być unikalny. W słowniku kojarzymy klucze (nazwy) z wartościami (szczegółami). Przykładem słownika jest książka adresowa, w której możesz znaleźć czyjś adres lub telefon znając dane tej osoby. Kluczem może być tylko obiekt niezmienny (na przykład napis czy krotka), ale wartości mogą być dowolne (napisy, krotki, listy, słowniki, liczby, ...). Tutaj niezmienność krotek znajduje swoje zastosowanie. Do tworzenia słowników służy następująca notacja: s = {klucz1 : wartość1, klucz2 : wartość2} Między kluczem a wartością jest dwukropek, zaś między parami są przecinki. Wszystko jest zamknięte w nawiasach klamrowych. Pamiętaj, że klucze w słowniku nie są w żaden sposób posegregowane. Jeżeli chcesz mieć je poukładane w jakimś szczególnym porządku, musisz ich listę samemu posortować. Słowniki to po angielsku dictionary, zaś klasa nazywa się krótko dict. Wyjaśnienie dla matematyka Słownik to funkcja w sensie matematycznym — ze zbioru kluczy w i na zbiór wartości. Przykład: #!/usr/bin/env python # -*- coding: utf-8 -*# Nazwa pliku: slownik.py # "ka" to skrót od "k"siążka "a"dresowa ka = { 'Jan' 'Tomek' 'Ela' 'Kasia' } : : : : '[email protected]', '[email protected]', '[email protected]', '[email protected]' print "Adres Kasi:", ka['Kasia'] # Usuwanie pary klucz-wartość. del ka['Kasia'] print u'\nKontaktów w książce adresowej jest {0}.\n'.format(len(ka)) # iterowanie przez pary słownika for imie, adres in ka.items(): print '{0} ma adres {1}'.format(imie, adres) # Dodawanie pary klucz-wartość. ka['Wojtek'] = '[email protected]' if 'Wojtek' in ka: print "\nAdres Wojtka:", ka['Wojtek'] # pobranie listy kluczy w słowniku l = ka.keys() print l # sprawdzenie czy klucz jest w słowniku jest = 'Tomek' in ka print jest Rezultat: Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic Adres Kasi: [email protected] Kontaktów w książce adresowej jest 3. Jan ma adres [email protected] Ela ma adres [email protected] Tomek ma adres [email protected] Adres Wojtka: [email protected] ['Jan', 'Wojtek', 'Ela', 'Tomek'] True Jak to działa? Tworzymy słownik ka używając omówionej już wcześniej notacji. Następnie docieramy do jednej z wartości używając nazwiska jako klucza. Operację pobrania elementu zapisujemy podobnie jak w przypadku indeksowania sekwencji. Niemniej pary w słowniku nie są uporządkowane i jako „indeksu” do słownika można użyć tylko jeden z kluczy. Możemy usuwać wpisy ze słownika za pomocą polecenia del — po prostu określamy słownik i klucz, który razem z odpowiednią wartością ma zostać usunięty. Samej wartości nie musimy wcale znać przy tej operacji. Następnie używamy metody items, która zwraca nam pary w postaci krotek, z których każda składa się z dwóch elementów — pierwszy to klucz, a drugi to wartość. Dzięki for...in... przypisujemy te pary do zmiennych, odpowiednio imie i adres, po czym wypisujemy je w bloku for. Do formatowania napisu wykorzystujemy tu metodę format. Jej argumentem jest krotka. Za numery w nawiasach klamrowych metoda format podstawia element krotki o tym indeksie. Możemy dodać nową parę klucz-wartość po prostu używając operatora indeksowania do oznaczenia klucza i przypisania mu wartości, tak jak zrobiliśmy to dla Wojtka w powyższym przykładzie. Możemy sprawdzić czy dany klucz istnieje w słowniku za pomocą operatora in. Jeśli chcesz poznać wszystkie metody dostępne dla klasy słowników, wpisz help(dict) albo zajrzyj do pomocy na sieci. Słowniki i krotki w przekazywaniu argumentów w wywołaniu funkcji Tak jak zostało to wcześniej wspomniane, słowniki służą do przekazywania nadmiarowych argumentów nazwanych do funkcji. Jako klucze słownika zostają użyte nazwy (nieistniejących) parametrów w postaci napisów. Klucze wskazują z kolei na wartości argumentów. Przykład def wypisz(separator,*wyrazy, **dodatkowe_informacje): print separator # ten argument MUSI wystąpić w wywołaniu funkcji print wyrazy # krotka zawierająca dodatkowe, NIENAZWANE argumenty print dodatkowe_informacje # słownik zawierający dodatkowe NAZWANE argumenty for w in wyrazy: print w, separator, print for klucz,wartosc in dodatkowe_informacje.items(): print klucz, wartosc wypisz(';', 'Być','albo' ,'nie być', sztuka='Hamlet', autor='Szekspir') Rezultat Niepoprawny język. Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source> Języki obsługiwane w podświetlaniu składni: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic ; ('By\xc4\x87', 'albo', 'nie by\xc4\x87') {'sztuka': 'Hamlet', 'autor': 'Szekspir'} Być ; albo ; nie być ; sztuka Hamlet autor Szekspir Dodatkowe zadania i przykłady Zob. też bardziej zaawansowane przykłady w rozdziale o wyjątkach. Bardziej ambitne zadanie wymagające inteligentnego użycia słowników: anagramy. Zbiór Zbiory to nieuporządkowane zestawy prostych obiektów. Używamy ich, gdy istotny jest tylko fakt występowania elementu, a nie jego położenie albo liczba powtórzeń. Zbiory możesz testować pod kątem występowania danego elementu, sprawdzać czy to jest podzbiór innego zbioru, szukać części wspólnej zbiorów i tak dalej. Przykład: >>> kraje = set(['Brazylia', 'Rosja', 'Indie']) >>> kraje.__contains__('Indie') True >>> kraje.__contains__('USA') False >>> kraje2 = kraje.copy() >>> kraje2.add('Chiny') >>> kraje2.issuperset(kraje) True >>> kraje.issubset(kraje2) True >>> kraje.remove('Rosja') >>> kraje.intersection(kraje2) set(['Brazylia', 'Indie']) Lista operatorów działających na zbiory jest przedstawiona w tabeli operatorów w drugim rozdziale. Te same operacje co powyżej można zwięźlej zapisać korzystając z operatorów zamiast metod. >>> kraje = set(['Brazylia', 'Rosja', 'Indie']) >>> 'Indie' in kraje True >>> 'USA' in kraje False >>> kraje2 = kraje | set(['Chiny']) >>> kraje2 > kraje True >>> kraje < kraje2 True >>> kraje.remove('Rosja') >>> kraje & kraje2 set(['Brazylia', 'Indie']) Wyjaśnienie dla matematyka Zbiór — struktura danych języka Python — posiada własności i można na nim wykonywać operacje takie jak dla zbioru w sensie obiektu matematycznego. Jak to działa? Ten przykład nie wymaga omawiania, gdyż użyte w nim są jedynie proste techniki matematyczne uczone w szkole. Dla porządku dodamy znaczenie używanych tu słów z języka angielskiego: set — zbiór, superset — nadzbiór, subset — podzbiór, intersection — część wspólna zbiorów. Podsumowanie Przestudiowaliśmy dokładnie różne wbudowane struktury danych Pythona. Będą one niezbędne przy pisaniu programów bardziej złożonych programów.