1-sahifa 2-sahifa


Download 363.98 Kb.
bet12/21
Sana06.06.2020
Hajmi363.98 Kb.
#115448
1   ...   8   9   10   11   12   13   14   15   ...   21
Bog'liq
Python


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).



140-bet

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 .



141-bet

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-bet

142

16-bob. Lug'atlar

lug'atdagi elementlar va ularni ajratib olish. Indeks bilan ishlash havolasi

operator bilan birgalikda ishlatilganda qiymati bo'lgan kalit

Plitalar ( = ). Agar indeks operatsiyada tayinlash bo'lmasa, uni

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)



143-bet

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 "", 1-qator, da

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.

16.3. Operatorda

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-bet

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 .

16.4. Stsenariy lug'at sintaksisi

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:





145-bet

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

MASLAHAT

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-bet

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:



147-bet

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-bet

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)]

MASLAHAT

Lug'atga kalitlarni kiritish tartibida buyurtma qilinganligini unutmang. Agar

sizga boshqa tartib kerak, qidirish ketma-ketligi bo'lishi kerak

saralash




149-bet

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-bet

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

16.8. Xulosa

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.



151-bet

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')]





152-bet

Download 363.98 Kb.

Do'stlaringiz bilan baham:
1   ...   8   9   10   11   12   13   14   15   ...   21




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling