1-sahifa 2-sahifa
Download 363.98 Kb.
|
Python
- Bu sahifa navigatsiya:
- 140-bet 16 Lugatlar
- 16.1. Lugat topshirigi
- 141-bet 16.1. Lugat topshirigi 141
- 16.2. Lugatdan qiymatlarni tanlash
- Lugatlar malumotlardan nusxa olmaydi
- 143-bet 16.3. Operatorda 143
- 16.4. Stsenariy lugat sintaksisi
- 145-bet 16.5. tosiqsiz 145
- 147-bet 16.7. Lugat raqamlari 147
- 16.6. Kalitlarni olib tashlash
- 149-bet 16.7. Lugat raqamlari 149
- 151-bet 16.9. Mashqlar 151
15.9. Mashqlar 1. Do'stlaringiz va hamkasblaringizning ismlari yozilgan ro'yxat yarating. O'rtachani hisoblang ro'yxatdagi ismlarning uzunligi. 2. Do'stlar va hamkasblarning ismlari yozilgan ro'yxat yarating. Qidirish John ham halqa uchun ro'yxatda yo'q . Agar ism topilmasa, tegishli ma'lumotni chop eting tegishli xabar (maslahat: boshqa foydalaning ). 3. Ismingiz, familiyangiz va yoshingizdan bog'lamlar ro'yxatini tuzing do'stlar va hamkasblar. Agar yosh ma'lum bo'lmasa, Hech birini kiriting . O'rta yoshni barcha None qiymatlarini o'tkazib yuborib hisoblang . Deduce oldingi (o'rtacha yoshdan kattaroq) satrdan keyin har bir ism uni) yoki yosh (o'rtacha yoshdan past).
16 Lug'atlar Lug'atlar - yuqori darajada optimallashtirilgan ichki tip Python tilida. Python lug'ati biroz oddiy lug'atni eslatadi, so'z va ta'riflardan iborat. Lug'atning vazifasi - tezkor ta'minlash kalit so'z bo'yicha ta'rifni qidiring. Tezlashtirish uchun oddiy lug'atda Siz ikkilik qidirish usulidan foydalanishingiz mumkin (ochiq) o'rtada lug'at, qaysi yarmida kerakli ekanligini aniqlang so'z va takrorlang). Python lug'ati so'zlar va ta'riflardan ham iborat, ammo ular deyiladi- Sia tugmachalari va qiymatlari mos ravishda. Lug'atning maqsadi - ta'minlash Tezda kalit orqali qidiring va shu kalit bilan bog'liq bo'lgan qiymatni oling. Oddiy lug'atda bo'lgani kabi, bu so'z ta'rifi bo'yicha ko'p vaqtni oladi (agar siz bu so'zni oldindan bilmasangiz), qidiring Python lug'atida bu juda sekin. Python 3.6-da lug'atlar yangi xususiyatga ega: endi kalitlar saralanadi kiritish tartibi. Agar siz Python kodini yozayotgan bo'lsangiz oldingi versiyalarda ishlaganda, 3.6-versiyadan oldin buni yodda tutishingiz kerak tugmachalarning tartibi o'zboshimchalik bilan amalga oshirilgan (Python-ni bajarishga imkon beradigan) tezkor qidiruv, lekin bu oxirgi foydalanuvchi uchun ayniqsa foydali emas edi). 16.1. Lug'at topshirig'i Lug'atlar kalitni qiymat bilan bog'laydi (boshqa tillarda) Ularni xesh , xesh kartalar , kartalar yoki uyushmalar deb atash mumkin .
16.1. Lug'at topshirig'i 141 kaptiv qatorlar ). Ma'lumotni saqlamoqchi ekaningizni ayting inson haqida. Taqdim etish uchun tupni qanday ishlatishni allaqachon ko'rgansiz yozuvlar. Ushbu muammoni hal qilish uchun lug'atlardan ham foydalanish mumkin. Shunday qilib Python-ga qanday lug'atlar kiritilgan, siz ularni yaratishda foydalanishingiz mumkin so'zma-so'z sintaksisi. Quyidagi lug'atda ism va familiya saqlanadi: >>> info = {'birinchi': 'Pit', 'oxirgi': 'Eng yaxshi'} ESLATMA Siz shuningdek, o'rnatilgan dik- klass yordamida lug'at yaratishingiz mumkin . Agar sinfga juft juftliklarning ro'yxatini topshiring, u lug'atga qaytadi: >>> info = dik ([('birinchi', 'Pit'), ... ("oxirgi", "eng yaxshi")]) Diktga qo'ng'iroq qilish paytida siz quyidagi parametrlardan foydalanishingiz mumkin: >>> ma'lumot = dik (birinchi = 'Pete', oxirgi = 'Eng yaxshi') Agar siz ko'rsatilgan parametrlardan foydalansangiz, ular haqiqiy bo'lishi kerak - mening Python o'zgaruvchan ismlarim, keyin ular satrlarga aylantiriladi. Lug'atga qiymatlarni kiritish uchun indeksdan foydalanishingiz mumkin operatsiyalar: >>> ma'lumot ['yoshi'] = 20 >>> ma'lumot ['mashg'ulot'] = 'Barabanchi' Ushbu misolda, kalitlar "birinchi" , "oxirgi" , "yosh" va "mashg'ulot" . Masalan, «yoshi» - bu qiymat mos keladigan kalit : butun son Lo 20. "yosh" ga mos keladigan qiymatni tezda topish uchun bajaring Indeks bo'yicha qidiruv: >>> ma'lumot ['yoshi'] yigirma
Boshqa tomondan, qaysi kalitni aniqlash kerak bo'lsa 20 qiymatiga to'g'ri keladi, bunday operatsiya juda sekin bo'ladi. Yuqoridagi misol uchun so'zma-so'z sintaksisini namoyish etadi dastlab tugallangan lug'atni yaratish. Misol ham ko'rsatmoqda kiritish uchun kvadrat qavslar (indeks operatsiyalari) qanday ishlatiladi
142 16-bob. Lug'atlar lug'atdagi elementlar va ularni ajratib olish. Indeks bilan ishlash havolasi
berilgan kalitga mos keladigan qiymatni topadi. 16.2. Lug'atdan qiymatlarni tanlash Ko'rib turganingizdek, kvadrat qavsli harflarning sintaksisi mumkin kvadrat qavs yordamida lug'atdan qiymat chiqarib oling tayinlash: >>> ma'lumot ['yoshi'] yigirma
Lug'atlar Kod
Kompyuter nima qiladi O'zgaruvchan ob'ektlar {:} Id: 4f3b
Turi: Dikt birinchi = 'Butrus' Lug'atlar ma'lumotlardan nusxa olmaydi info = {'ism': birinchi} birinchi "Butrus"
Str ma'lumot
'ism' Str
Anjir. 16.1. Lug'at yarating. Bunday holda, qiymat ishlatiladi mavjud o'zgaruvchi. Esda tuting: lug'at o'zgaruvchini ko'chirmaydi, lekin unga ko'rsatgich yaratadi (ma'lumotlarning sonini ko'paytirish)
16.3. Operatorda 143 Biroq, ehtiyot bo'ling - kalitga kirishga harakat qilganingizda, yo'q Lug'at uchun Python istisno qiladi: >>> ma'lumot ['Band'] Traceback (eng so'nggi qo'ng'iroq oxirgi): Fayl " KeyError: 'Band' Python dastur maqsadlarini aniq ifoda etish bilan ajralib turadi xato va xatolarni tezda aniqlash, istisnolarni kiritish mumkin xush kelibsiz. Siz "Band" tugmachasi lug'atda yo'qligini bilasiz . Bu bo'lgandi Python uchun tasodifiy qiymatni qaytarsa, bundan ham battarroq bo'ladi lug'atda bo'lmagan kalit. Bu yanada rivojlanishiga olib keladi dasturdagi xatolarni yoyish va mantiqiy nuqsonni yashirish.
Python beradi bir yilda bayonotida tezlik tekshirish imkonini beradi lug'atda kalit mavjudligi: >>> Ma'lumotda "Band" Yolg'on >>> ma'lumot ichida "birinchi" Rost Agar turganimizdek, ichida ham ketliklar bilan ishlaydi. Opera Torus yilda ro'yxati, majmui yoki kanop uchun bilan foydalanish mumkin tasdiq tekshirishlari: >>> 5 ning [1, 3, 6] Yolg'on
>>> {'a', 'e', 'i'} ichida 't' Yolg'on
>>> "Pol" dagi "P" harfi Rost
ESLATMA Python 3-da, xuddi shu narsani ta'minlaydigan .has_key usuli sifatida funktsional yilda amri , lekin faqat lug'atlar bilan ishlaydi. Har qanday keng qirrali bo'lishga olib keladigan harakatlar qabul qilinadi!
144 16-bob. Lug'atlar In buyrug'i aksariyat idishlar bilan ishlaydi. Shu bilan bir qatorda, mumkin Ushbu buyruqni qo'llab-quvvatlaydigan maxsus sinflarni aniqlang. Ovoz balandligi Loyiha ro'yxatga olishni qo'llab-quvvatlashi kerak yoki a .__ o'z ichiga oladi____ usulini .
Lug'atning .get usuli kalitga mos keladigan qiymatni oladi. Usul .get shuningdek qiymati uchun ixtiyoriy parametrni olishi mumkin agar kalit topilmasa, sukut bo'yicha. Agar janrni da'vo qilishni xohlasangiz Qiymat "Rok" ga o'rnatildi , buni quyidagicha bajarish mumkin: >>> janr = info.get ('Janr', 'Rok') >>> janri "Rok"
MASLAHAT Usul. olish lug'atlar bir atrofida olish uchun bir yo'ldir KeyError istisno qachon olish uchun kvadrat qavslar sintaksisidan foydalanishga harakat qilmoqda lug'atda bo'lmagan kalit orqali 16.5. to'siqsiz Lug'atlar yomon nom bilan foydali usulga ega .setdefault . Ushbu usul avval va .get kabi imzoga ega xuddi shunday ishlaydi: agar kalit bo'lmasa, u standart qiymatni qaytaradi mavjud. Bunga qo'shimcha ravishda, u shuningdek, standart qiymat bilan kalit bilan bog'lanadi. agar kalit topilmasa. Yildan .setdefault bir qiymat qaytaradi, agar siz uni o'zgaruvchan tur bilan (masalan, lug'at yoki ro'yxat), natijani joyida o'zgartirish mumkin. .Setdefault usuli haydovchini yaratish uchun ishlatilishi mumkin kalit hisoblagich. Masalan, miqdorni hisoblashni istasangiz bir xil ismli odamlar, buni quyidagicha qilish mumkin: >>> names = ['Ringo', 'Paul', 'John', ... 'Ringo']
>>> soni = {} >>> ismlarda ism uchun:
16.5. to'siqsiz 145 ... hisoblash.sozsiz (nom, 0) ... hisoblash [ism] + = 1 Holda .setdefault usuli , bir oz ko'proq kodi talab qilinadi: >>> names = ['Ringo', 'Paul', 'John', ...
'Ringo'] >>> soni = {} >>> ismlarda ism uchun: ... agar ism hisobga olinmasa: ... hisoblash [nomi] = 1 ... yana: ...
hisoblash [ism] + = 1 >>> hisoblash ['Ringo'] 2
Bunday hisoblash operatsiyalari shunchalik keng tarqalganki, keyinchalik collections.Counter sinf standart Python kutubxonasi qo'shildi . Bu sinf sizga bunday operatsiyalarni yanada ixcham shaklda bajarishga imkon beradi: >>> import to'plamlari >>> hisoblash = to'plamlar. Uy (('' Ringo ',' Pol ', ... 'Djon', 'Ringo']) >>> hisoblash Hisoblagich ({'Ringo': 2, 'Pol': 1, 'Djon': 1}) >>> hisoblash ['Ringo'] 2 >>> hisoblash ['Fred'] 0 Quyida ba'zi bir sun'iy misol namoyish etiladi .setdefault natijasini o'zgartirish . Aytaylik, sizda lug'at bor, musiqachining ismini u o'ynagan guruh nomi bilan bog'lash. Agar Pavlus ismli kishi ikki guruhga kirsa , natijasi bo'lishi kerak Pavlus ismini ikkala guruhni o'z ichiga olgan ro'yxat bilan bog'lang : >>> band1_names = ['Djon', 'Jorj', ... "Pol", "Ringo"] >>> band2_names = ['Paul'] >>> name_to_bands = {} >>> band1_namesdagi ism uchun:
146 16-bob. Lug'atlar ... name_to_bands.setdefault (ism, ...
[]). qo'shing ('Bitlz') >>> band2_namesdagi ism uchun: ... name_to_bands.setdefault (ism, ...
[]). qo'shing ('Qanotlar') >>> chop eting (ismlar_to_bands ['Paul']) ['Bitlz', 'Qanotlar'] Mavzuni ishlab chiqish uchun: belgilangan muddatsiz ushbu kod uzoqroq bo'ladi: >>> band1_names = ['Djon', 'Jorj', ... "Pol", "Ringo"] >>> band2_names = ['Paul'] >>> name_to_bands = {} >>> band1_namesdagi ism uchun: ... agar ismlar_to_bandsda bo'lmasa: ... name_to_bands [name] = [] ... name_to_bands [name]. \ ...
qo'shish ('Bitlz') >>> band2_namesdagi ism uchun: ... agar ismlar_to_bandsda bo'lmasa: ...
name_to_bands [name] = [] ... name_to_bands [name]. \ ... qo'shish ('Qanotlar') >>> chop eting (ismlar_to_bands ['Paul']) ['Bitlz', 'Qanotlar'] MASLAHAT Python standart kutubxonasidagi to'plamlar moduli qulay sinf odatiy qaror . Bu sinf o'z xatti-harakati bilan lug'atga o'xshaydi ammo kalitni standart qiymat sifatida belgilashga imkon beradi ixtiyoriy zavod (fabrika). Agar zavod parametrlari boshqacha bo'lsa Yo'q , u har safar boshlanib, qiymat sifatida kiritiladi etishmayotgan kalit. Oldingi misol odatiy qaror bilan qayta yozilishi mumkin quyidagi shaklda: >>> to'plamlardan import qilish uchun odatiy qaror >>> name_to_bands = odatiy qaror (ro'yxat) >>> band1_namesdagi ism uchun: ... name_to_bands [name]. \ ... qo'shish ('Bitlz') >>> band2_namesdagi ism uchun:
16.7. Lug'at raqamlari 147 ... name_to_bands [name]. \ ... qo'shish ('Qanotlar') >>> chop eting (ismlar_to_bands ['Paul']) ['Bitlz', 'Qanotlar'] Defaulttict kodi ishlatilgandan ko'ra biroz tushunarli setdefault . 16.6. Kalitlarni olib tashlash Boshqa standart lug'at ishi bu kalitlarni olib tashlash va ularning ma'nolari. Lug'atdan biror narsani olib tashlash uchun foydalaning Del buyrug'i deyiladi : # "Ringo" ni lug'atdan olib tashlash >>> del names_to_bands ['Ringo'] MASLAHAT Python lug'at davomida ma'lumotlarni qo'shish yoki o'chirishga ruxsat bermaydi busting. Bunday holatlarda Python RuntimeError istisnosini tashlaydi : >>> ma'lumotlar = {'name': 'Matt'} >>> ma'lumotlar kaliti uchun: ... del ma'lumotlar [kalit] Traceback (eng so'nggi qo'ng'iroq oxirgi): ...
RuntimeError: iteratsiya paytida lug'at hajmi o'zgartirildi 16.7. Lug'at raqamlari Lug'atlar, shuningdek, qo'pol kuch qo'llab-quvvatlash uchun . Sukut bo'yicha lug'atdan qidirish orqali siz kalitlarni olasiz: >>> ma'lumotlar = {'Odam': 2, 'Zik': 5, 'Fred': 3} >>> ma'lumotlardagi ism uchun: ... bosma (ism) Odam Zek
Fred
148 16-bob. Lug'atlar ESLATMA Lug'atlarda " .keys" usuli mavjud , bu ham lug'at tugmachalari ustidan iteratsiya qilinadi . Python 3 usulida .keys vakillikni (ko'rinishni) - pro uchun «oyna» ni qaytaradi. Lug'atda mavjud tugmalarni ko'rish. Ishlash, ro'yxat kabi, uni takrorlash uchun foydalanish mumkin. Biroq, farqli o'laroq ska, u bu kalitlarning nusxasi emas. Keyinchalik kalit o'chiriladi lug'at, bu o'zgarish ko'rinishda aks etadi - lekin ro'yxatda emas. Lug'atdagi qiymatlarni takrorlash uchun usul bo'yicha saralash . qiymatlar : >>> ma'lumotlar uchun qiymat uchun (): ... bosib chiqarish (qiymat) 2 5 3 Qabul qilish natijasi .vallar ham ko'rinishdir. U aks ettiradi lug'atdagi qadriyatlarning hozirgi holati. Qaytarilish paytida kalit va qiymatni olish uchun foydalaning Ko'rishni qaytaradigan .items usuli : >>> kalit uchun, data.items () dagi qiymat: ... bosib chiqarish (kalit, qiymat) Odam 2
Zeek 5 Fred 3
Agar siz ko'rinishni ro'yxatga qo'shsangiz, ushbu ro'yxatni ko'rasiz to'garaklar ketma-ketligi (kalit, qiymat) - bu lug'at tuzish uchun diktani oladi : >>> ro'yxati (data.items ()) [('Odam', 2), ('Zik', 5), ('Fred', 3)]
Lug'atga kalitlarni kiritish tartibida buyurtma qilinganligini unutmang. Agar sizga boshqa tartib kerak, qidirish ketma-ketligi bo'lishi kerak saralash
16.7. Lug'at raqamlari 149 Ichki tartiblangan funktsiya yangi tartiblangan ro'yxatni qaytaradi. berilgan ketma-ketlik uchun: >>> saralangan nomlar uchun (data.keys ()): ... bosma (ism) Odam
Fred Zek
Saralangan funktsiyaga o'tish uchun ixtiyoriy teskari argument mavjud qarama-qarshi chiqish tartibi: >>> saralangan nomlar uchun (data.keys (), ... teskari = True): ... bosma (ism) Zek
Fred Odam
ESLATMA Kalitlar har xil bo'lishi mumkin. Bitta asosiy shart bu romashka - xashaklilik . Masalan, ro'yxat axlatlanmaganligi sababli u o'zgarishi mumkin va Python o'z navbatida hashni yarata olmaydi joriy tarkibga tegishli. Agar siz ro'yxatni shunday ishlatsangiz tugmachasini bosing va keyin kalitni o'zgartiring, lug'at qanday qiymatga qaytishi kerak - uchun eski ro'yxat, yangi ro'yxat uchun, ikkalasini ham birdaniga? Python taxmin qilishga jur'at etmaydi va dasturchiga o'zgarmas kalitlardan foydalanishni buyuradi. Siz tugmachalar sifatida lug'atga elementlarni qo'shishingiz mumkin butun sonlar va satrlar: >>> g'alati = {1: 'birinchi', ... '1': 'yana bir boshqasi'} Odatda har xil turdagi kalitlarni aralashtirish tavsiya etilmaydi, chunki u kodni kamroq tushunarli qiladi va tartiblashni murakkablashtiradi. Python 3 tartiblamaydi aniq ko'rsatadigan kalit funktsiyasiz aralash turdagi ro'yxatlar Python, har xil turlarni taqqoslash. Bu shunday holatlardan biri Python sizga biron bir narsa qilishga imkon beradi, ammo bu siz foydalanishingiz kerak degani emas bu imkoniyat. Python-ning asosiy ishlab chiquvchilaridan biri aytganidek Raymond Xettinger: "Ko'pchilik" Men qila olaman "kabi savollar
150 16-bob. Lug'atlar Pythonda x qila olamanmi ? ” degan savolga javob bera olaman Yaqin atrofda poezd bo'lmasa, relsli mashina-chi? Ha sen qila olasan. Yo'q, bunga loyiq emas ”. @raymondh
Ushbu bob lug'atlarga bag'ishlangan edi. Ushbu ma'lumotlarning tuzilishi muhimdir. roli, chunki u "qurilish bloklari" dan biri. Python Sinflar, ism maydonlari va modullar hammasi ichkarida Python dasturlari lug'atlarga asoslangan. Lug'atlar tezkor qidiruvni ta'minlaydi yoki kalit yordamida kiritadi. Shuningdek qiymat bo'yicha izlash mumkin, ammo u sekin. Agar Siz ko'pincha ushbu operatsiyani lug'atlar bilan bajarish kerak, bu haqiqat "sevgilim bilan" kodi belgisi - boshqa tuzilishdan foydalanishni o'ylab ko'ring ma'lumotlar turlari. Lug'atni o'zgartirish usullari ham taqdim etildi. Lug'atda siz mumkin tugmachalarni kiritish va olib tashlash, shuningdek qachon egalik huquqini tekshirish yodgorliklari In . Biz foydalanadigan ba'zi oddiy bo'lmagan inshootlarni ko'rib chiqdik Kerakli .setdefault kiritish va qaytarish qiymatlari bitta operatsiyada. Shuningdek, hisoblagichga ixtisoslashtirilgan lug'at darslari joriy etildi. va to'plamlar modulidan standart sozlama . Lug'atlar o'zgaruvchan bo'lgani uchun siz ulardan buyruq tugmachalarini olib tashlashingiz mumkin doi del . Bu lug'at kalitlari ustida yineleme qilish ham mumkin uchun Loop . Python 3.6 lug'atlarda elementlarning tartibini joriy qildi. Tugmalar alifbo yoki raqam bo'yicha emas, balki kiritish tartibida tartiblangan xop.
16.9. Mashqlar 1. Ismingizni, familiyangizni saqlaydigan ma'lumot lug'atini yarating va yosh.
16.9. Mashqlar 151 2. O'zingiz haqingizda tafsilotlar bilan bo'sh telefon lug'atini yarating telefon. Ekran o'lchamiga, hajm hajmiga ma'lumot qo'shish yalpiz, OS, ishlab chiqarish kompaniyasi va boshqalar. 3. Matnning paragrafini uch tirnoqli qatorga yozing - ki. So'zlar ro'yxatini yaratish uchun .split usulidan foydalaning . Yaratmoq paragrafdagi har bir so'zning yuzaga kelishining hisoblagichini saqlash uchun lug'at. 4. Matn paragrafida har bir so'z necha marta ishlatilganligini hisoblang. yuz Ralf Valdo Emerson. 5. Anagrammalarni ko'rsatish uchun kod yozing (bir xil so'zlardan iborat so'zlar) harflar boshqa tartibda) matnning paragrafidan. 6. PageRank algoritmi qidiruv tizimini yaratishda ishlatilgan. biz google. Algoritm har bir sahifaga reyting asosida tayinlaydi kiruvchi havolalar soni bo'yicha. U bitta kirish qiymatini oladi Izoh: Boshqa sahifalarga bog'langan sahifalar ro'yxati. Har biriga sahifaga dastlab unvon beriladi 1. Bir nechta Algoritmning iteratsiyasi odatda 10 ga teng. Har bir iteratsiya uchun: • sahifa o'z martabasini soniga qarab ajratadi bog'langan, u bog'langan har bir sahifaga; • Berilgan daraja , odatda , pasayish koeffitsientiga ko'paytiriladi lekin 0,85 ga teng. Ushbu algoritmning 10 ta iteratsiyasini bajarish uchun kod yozing kirish va chiqish havolalari to'plami: havolalar = [('a', 'b'), ('a', 'c'), ('b', 'c')]
Download 363.98 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling