Кортежҳо ва маҷмӯъҳо
Рӯйхат — коллексияи универсалӣ аст. Вале боз ду навъ ҳаст, ки баъзе масъалаҳоро соддатар ва тезтар мекунанд: кортежҳо ва маҷмӯъҳо.
Кортежҳо
Кортеж (tuple) ба рӯйхат монанд аст, вале онро тағйир додан мумкин нест. Дар қавсҳои доира навишта мешавад:
point = (3, 5)
print(point[0]) # 3
point[0] = 10 # хато: кортеж тағйирнопазир аст
Кортежҳо барои якҷоя нигоҳ доштани якчанд қимати бо ҳам алоқаманд қулайанд: координатаҳо, «ном ва синну сол», «рӯз ва ҳарорат».
Кушодан (распаковка)
Кортежро ба тағйирёбандаҳо тақсим кардан мумкин аст — мо инро ҳангоми вуруд аллакай карда будем:
x, y = (3, 5)
name, age = "Лайло", 14 # қавсҳоро навиштан шарт нест
Аз ин ҷо усули қулай — ҷой иваз кардани қиматҳо бе тағйирёбандаи сеюм:
a, b = 1, 2
a, b = b, a # акнун a = 2, b = 1
Рӯйхати кортежҳо
cities = [("Хуҷанд", 190), ("Кӯлоб", 110), ("Бохтар", 120)]
for name, population in cities:
print(name, population)
Муқоиса ва мураттабсозии кортежҳо
Кортежҳо элемент ба элемент муқоиса мешаванд: аввал элементҳои аввал, ҳангоми баробарӣ — дуюмҳо ва ҳамин тавр.
print((1, 9) < (2, 0)) # True — элементи аввал ҳал мекунад
print((2, "б") < (2, "в")) # True — аввалҳо баробаранд, дуюм ҳал мекунад
Бинобар ин рӯйхати кортежҳо якбора аз рӯи якчанд аломат мураттаб мешавад:
fruits = [(3, "нок"), (1, "себ"), (3, "анор")]
fruits.sort()
print(fruits) # [(1, 'себ'), (3, 'анор'), (3, 'нок')]
Аввал аз рӯи адад, ҳангоми ададҳои баробар бошад — аз рӯи ном. Барои аз рӯи як аломат бо тартиби камшавӣ ва аз рӯи дигараш бо тартиби афзоиш мураттаб кардан, ададро бо минус нигоҳ доштан мумкин аст: (-адад, ном). Ҳамин тавр «минус адад»-и хурдтар ба адади калонтар мувофиқ меояд.
Маҷмӯъҳо
Маҷмӯъ (set) қиматҳоро бе такрор ва бе тартиб нигоҳ медорад:
colors = {"сурх", "кабуд", "сурх"}
print(len(colors)) # 2
empty = set() # маҷмӯи холӣ (на {} — ин луғат аст)
Илова ва санҷиш:
seen = set()
seen.add(5)
seen.add(5) # такрор илова намешавад
print(5 in seen) # True
seen.discard(5) # агар бошад, нест кардан
Чаро маҷмӯъҳо тезанд
Санҷиши x in рӯйхат элементҳоро якто-якто мегузарад: барои рӯйхати 105 элемент ин 105 муқоиса аст. Санҷиши x in маҷмӯъ новобаста аз андоза як амал мегирад. Агар дар давра бисёр бор пурсӣ «оё чунин қимат аллакай буд?», дидаҳоятро дар маҷмӯъ нигоҳ дор.
nums = [4, 7, 4, 1, 7, 7]
seen = set()
first_repeat = None
for x in nums:
if x in seen:
first_repeat = x
break
seen.add(x)
print(first_repeat) # 4
Амалҳо бо маҷмӯъҳо
a = {1, 2, 3, 4}
b = {3, 4, 5}
print(a | b) # {1, 2, 3, 4, 5} — иттиҳод
print(a & b) # {3, 4} — буриш
print(a - b) # {1, 2} — фарқ
print(a ^ b) # {1, 2, 5} — маҳз дар яке ҳаст
Маҷмӯъ аз рӯйхат: set(рӯйхат). Ҳамин тавр такрорҳоро зуд нест мекунанд: len(set(a)) — дар рӯйхат чанд қимати гуногун ҳаст.
Тартиб кафолат дода намешавад
Маҷмӯъ тартиби элементҳо надорад: чопи print(s) метавонад онҳоро бо пайдарпайии ғайричашмдошт барорад. Агар дар масъала тартиб лозим бошад, sorted(s) кун.
Дар маҷмӯъ танҳо қиматҳои тағйирнопазир буда метавонанд: ададҳо, сатрҳо, кортежҳо. Рӯйхатро ба маҷмӯъ гузоштан мумкин нест.
Хулоса
- кортежи
(a, b)— маҷмӯи тағйирнопазири қиматҳо; кушоданx, y = t, ҷой иваз карданa, b = b, a; - кортежҳо элемент ба элемент муқоиса мешаванд — мураттабсозии рӯйхати кортежҳо якчанд аломатро ба назар мегирад;
- маҷмӯъ қиматҳоро бе такрор нигоҳ медорад,
x in sдар як амал кор мекунад; | & - ^— иттиҳод, буриш, фарқ, фарқи симметрӣ;- маҷмӯъ тартиб надорад — барои хуруҷ мураттаб кун.