Loading...
Python

Կարող եք ձեր կոդը փորձարկել այստեղ

Python

Գլուխ 5. Ցուցակներ, կրկնօրինակներ և բառարաններ

Բառարաններ

Python-ի բառարանը պահպանում է տարրերի հավաքածու, որտեղ յուրաքանչյուր տարր ունի յուրահատուկ բանալի և դրա հետ կապված արժեք:
Բառարանի սահմանումն ունի հետևյալ շարահյուսությունը.
dictionary = { key1:value1, key2:value2, ....}
Գանգուր փակագծերում սահմանվում է տարրերի հաջորդականություն՝ բաժանված ստորակետերով, որտեղ յուրաքանչյուր տարրի համար նախ նշվում է բանալին և նշվում է դրա արժեքը՝ առանձնացված երկու կետով:
Եկեք սահմանենք բառարան.
users = {1: "Tom", 2: "Bob", 3: "Bill"}
Օգտատերերի բառարանն օգտագործում է թվերը որպես բանալիներ, իսկ տողերը՝ որպես արժեքներ: Այսինքն՝ 1 բանալիով տարրն ունի «Թոմ» արժեք, 2 բանալիով տարրը՝ «Բոբ» արժեքը և այլն։
Մեկ այլ օրինակ.
emails = {"tom@gmail.com": "Tom", "bob@gmai.com": "Bob", "sam@gmail.com": "Sam"}
Էլփոստի բառարանը օգտագործում է տողեր՝ օգտվողի էլ. հասցեներ, որպես բանալիներ, և տողեր՝ օգտվողի անուններ՝ որպես արժեքներ:
Բայց պարտադիր չէ, որ ստեղները և տողերը լինեն նույն տեսակի: Նրանք կարող են ներկայացնել տարբեր տեսակներ.
objects = {1: "Tom", "2": True, 3: 100.6}
Մենք կարող ենք նաև ընդհանուր առմամբ սահմանել դատարկ բառարան առանց տարրերի.
objects = {}
կամ այսպես.
objects = dict()
Ցուցակները և բազմապատիկները բառարանի վերածելը
Չնայած այն հանգամանքին, որ բառարանը և ցուցակը կառուցվածքով տարբեր տեսակներ են, այնուամենայնիվ, ցուցակների որոշ տեսակների համար հնարավոր է դրանք վերածել բառարանի, օգտագործելով ներկառուցված dict() ֆունկցիան : Դա անելու համար ցուցակը պետք է պահպանի ներդիր ցուցակների մի շարք: Յուրաքանչյուր ներդիր ցուցակ պետք է բաղկացած լինի երկու տարրից. երբ վերածվում է բառարանի, առաջին տարրը կդառնա բանալին, իսկ երկրորդը կդառնա արժեքը.
users_list = [ ["+111123455", "Tom"], ["+384767557", "Bob"], ["+958758767", "Alice"] ] users_dict = dict(users_list) print(users_dict) # {"+111123455": "Tom", "+384767557": "Bob", "+958758767": "Alice"}
Նմանապես, դուք կարող եք երկչափ բազմոցները վերածել բառարանի, որն իր հերթին պարունակում է երկու տարրերից բաղկացած բազմություններ.
users_tuple = ( ("+111123455", "Tom"), ("+384767557", "Bob"), ("+958758767", "Alice") ) users_dict = dict(users_tuple) print(users_dict)
Էլեմենտների ստացում և փոփոխություն
Բառարանի տարրեր մուտք գործելու համար քառակուսի փակագծերում իր անունից հետո նշվում է տարրի ստեղնը՝
dictionary[ключ]
Օրինակ, եկեք ստանանք և փոխենք բառարանի տարրերը.
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } print(users["+11111111"]) # Tom users["+33333333"] = "Bob Smith" print(users["+33333333"]) # Bob Smith
Եթե նման բանալիով տարրի արժեքը սահմանելիս այն չկա բառարանում, կավելացվի.
users["+4444444"] = "Sam"
Բայց եթե մենք փորձենք արժեք ստանալ բառարանում չգտնվող բանալիով, Python-ը կստեղծի KeyError.
user = users["+4444444"] # KeyError
Եվ այս իրավիճակը կանխելու համար, նախքան որևէ տարր մուտք գործելը, մենք կարող ենք ստուգել բառարանում բանալիի առկայությունը՝ օգտագործելով բառարանում բառի բանալին : Եթե բանալին բառարանում է, ապա այս արտահայտությունը վերադարձնում է True:
key = "+4444444" if key in users: user = users[key] print(user) else: print("element not found")
Դուք կարող եք նաև օգտագործել get մեթոդը տարրեր ստանալու համար, որն ունի երկու ձև.
get(key): բառարանից վերադարձնում է տարրը բանալին բանալին: Եթե նման բանալիով տարր չկա, այն վերադարձնում է None արժեքը
get(key, default): բառարանից վերադարձնում է տարրը բանալին բանալին: Եթե նման բանալիով տարր չկա, այն վերադարձնում է լռելյայն արժեքը
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } user1 = users.get("+55555555") print(user1) # Alice user2 = users.get("+33333333", "Unknown user") print(user2) # Bob user3 = users.get("+44444444", "Unknown user") print(user3) # Unknown user
Հեռացում
Տարրը բանալիով հեռացնելու համար օգտագործեք del օպերատորը.
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } del users["+55555555"] print(users) # { "+11111111": "Tom", "+33333333": "Bob"}
Բայց արժե հաշվի առնել, որ եթե նման բանալի չկա բառարանում, բացառություն կհայտնվի KeyError: Հետևաբար, կրկին, նախքան ջնջելը, նպատակահարմար է այս բանալիով ստուգել տարրի առկայությունը:
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } key = "+55555555" if key in users: del users[key] print(f"{key} removed") else: print("element not found")
Հեռացնելու մեկ այլ եղանակ է pop() մեթոդը : Այն ունի երկու ձև.
pop(key): հեռացնում է տարրը բանալիով և վերադարձնում հեռացված տարրը: Եթե այս բանալիով տարր չկա, բացառություն է բացվում KeyError
pop(key, default): հեռացնում է տարրը բանալիով և վերադարձնում հեռացված տարրը: Եթե այս բանալիով տարր չկա, ապա վերադարձվում է լռելյայն արժեքը
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } key = "+55555555" user = users.pop(key) print(user) # Alice user = users.pop("+4444444", "Unknown user") print(user) # Unknown user
Եթե Ձեզ անհրաժեշտ է հեռացնել բոլոր տարրերը, ապա այս դեպքում կարող եք օգտագործել clear() մեթոդը.
users.clear()
Բառարանների պատճենում և միաձուլում
copy() մեթոդը պատճենում է բառարանի բովանդակությունը՝ վերադարձնելով նոր բառարան.
users = {"+1111111": "Tom", "+3333333": "Bob", "+5555555": "Alice"} students = users.copy() print(students) # {"+1111111": "Tom", "+3333333": "Bob", "+5555555": "Alice"}
Update() մեթոդը միավորում է երկու բառարան.
users = {"+1111111": "Tom", "+3333333": "Bob"} users2 = {"+2222222": "Sam", "+6666666": "Kate"} users.update(users2) print(users) # {"+1111111": "Tom", "+3333333": "Bob", "+2222222": "Sam", "+6666666": "Kate"} print(users2) # {"+2222222": "Sam", "+6666666": "Kate"}
Այս դեպքում users2 բառարանը մնում է անփոփոխ։ Փոխվում է միայն օգտվողների բառարանը, որին ավելացվում են մեկ այլ բառարանի տարրեր։ Բայց եթե անհրաժեշտ է, որ երկու աղբյուրի բառարաններն էլ մնան անփոփոխ, և միաձուլման արդյունքը լինի ինչ-որ երրորդ բառարան, ապա կարող եք նախ պատճենել մի բառարանը մյուսին.
users3 = users.copy() users3.update(users2)
Բառարանի որոնում
Բառարանի միջոցով կրկնելու համար կարող եք օգտագործել for loop.
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } for key in users: print(f"Phone: {key} User: {users[key]} ")
Տարրերի վրա կրկնելիս մենք ստանում ենք ընթացիկ տարրի բանալին և դրանից կարող ենք ստանալ հենց տարրը:
Նյութերի վրա կրկնելու մեկ այլ միջոց է օգտագործել items () մեթոդը.
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } for key, value in users.items(): print(f"Phone: {key} User: {value} ")
Մեթոդը items() վերադարձնում է բազմակի մի շարք: Յուրաքանչյուր tuple պարունակում է տարրի բանալին և արժեքը, որը, երբ կրկնվում է, մենք անմիջապես կարող ենք մուտք գործել հիմնական և արժեքային փոփոխականներ:
Կան նաև ստեղների և արժեքների թվարկման առանձին տարբերակներ։ Ստեղների վրա կրկնելու համար մենք կարող ենք բառարանում զանգահարել keys() մեթոդը.
for key in users.keys(): print(key)
Ճիշտ է, թվարկման այս մեթոդը իմաստ չունի, քանի որ նույնիսկ առանց keys() մեթոդը կանչելու մենք կարող ենք թվարկել ստեղները, ինչպես ցույց է տրված վերևում։
Միայն արժեքների վրա կրկնելու համար մենք կարող ենք զանգահարել values() մեթոդը բառարանում.
for value in users.values(): print(value)
Բարդ բառարաններ
Բացի ամենապարզ առարկաներից, ինչպիսիք են թվերը և տողերը, բառարանները կարող են պահել նաև ավելի բարդ առարկաներ՝ նույն ցուցակները, կրկնակները կամ այլ բառարաններ.
users = { "Tom": { "phone": "+971478745", "email": "tom12@gmail.com" }, "Bob": { "phone": "+876390444", "email": "bob@gmail.com", "skype": "bob123" } }
Այս դեպքում բառարանի յուրաքանչյուր տարրի արժեքն իր հերթին ներկայացնում է առանձին բառարան։
Ներդրված բառարանի տարրեր մուտք գործելու համար դուք պետք է օգտագործեք երկու բանալի.
old_email = users["Tom"]["email"] users["Tom"]["email"] = "supertom@gmail.com" print(users["Tom"]) # { phone": "+971478745", "email": "supertom@gmail.com }
Բայց եթե մենք փորձենք արժեք ստանալ բառարանում չգտնվող բանալիից, Python-ը բացառություն կանի KeyError.
tom_skype = users["Tom"]["skype"] # KeyError
Այս սխալից խուսափելու համար կարող եք ստուգել բառարանում բանալիի առկայությունը.
key = "skype" if key in users["Tom"]: print(users["Tom"]["skype"]) else: print("skype is not found")
Կամ կարող եք օգտագործել get() մեթոդը.
users = { "Tom": { "phone": "+971478745", "email": "tom12@gmail.com" } } tom_skype = users["Tom"].get("skype", "Undefined") print(tom_skype) # Undefined

Մեկնաբանություն գրելու համար խնդրում ենք մուտք լինել