Гузариш ба мундариҷа
Мавзӯи 12 аз 18

Кортежҳо ва маҷмӯъҳо

Рӯйхат — коллексияи универсалӣ аст. Вале боз ду навъ ҳаст, ки баъзе масъалаҳоро соддатар ва тезтар мекунанд: кортежҳо ва маҷмӯъҳо.

Кортежҳо

Кортеж (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 дар як амал кор мекунад;
  • | & - ^ — иттиҳод, буриш, фарқ, фарқи симметрӣ;
  • маҷмӯъ тартиб надорад — барои хуруҷ мураттаб кун.