Ачааллж байна...
Энэ хичээлд шинэ бичлэг байхгүй. Шинэ функц, шинэ түлхүүр үг, шинэ синтакс — юу ч байхгүй. Энэ бол бүхэлдээ ШИЙДВЭР -ийн тухай хичээл.
Асуулт нь энгийн: энэ өгөгдлийг list, tuple, set, dictionary-гийн алинд хадгалах вэ?
Эхлээд харахад энэ асуулт нь чухал биш мэт санагдаж болно. Эцсийн эцэст, ихэнх зүйлийг list ашиглан хийж болно. Хэрэв танд хос хэрэгтэй бол — хоёр элементтэй list. Хэрэв давхардлыг устгах хэрэгтэй бол — гараар шалгах loop. Хэрэв нэрээр хайх хэрэгтэй бол — жагсаалтыг гүйж, тохирохыг нь олох.
Бүгд ажиллана. Гэвч буруу бүтэц сонгосон код нь ГУРВАН асуудал үүсгэдэг:
Удаан. Мянган элементтэй жагсаалтад хайх нь set-д хайхаас мянга дахин удаан.
Ойлгомжгүй. hun[0] гэсэн код юу гэсэн үг вэ? hun["ner"] гэсэн код өөрөө хэлж байна.
Алдаатай. Координатыг list болгож хадгалбал хэн нэгэн .append() хийж, гурав дахь тоо нэмж болно.
Зөв бүтэц сонговол эдгээр гурван асуудал бүгд АРИЛНА. Тэгээд ч код нь богино болно, учир нь бүтэц өөрөө ажлыг тань хийж өгнө.
Энэ хичээл нь Түвшин 2-ын үлдсэн хэсэг, Бүлэг 6-ийн guided build, Бүлэг 9-ийн номын сангийн систем, Бүлэг 12-ийн цаг агаарын программ — бүгдэд шууд хэрэглэгдэнэ. Тэдгээр төсөл бүрд эхний асуулт нь үргэлж "өгөгдлөө яаж бүтцэлэх вэ" байх болно.
Гал тогооны өрөө төсөөлье. Танд гурван зүйл байна: гурил, амтлагчид, зочдын жагсаалт.
Гурилыг та том шуудайд хийнэ. Хэдэн ч кг байж болно, нэмж болно, хасч болно. Тэдгээр нь бүгд ижилхэн — нэг ширхэг гурил нөгөөгөөсөө ялгаагүй. Хэрэгтэй нь зөвхөн ХЭМЖЭЭ. Энэ бол list.
Амтлагчдыг та ШОШГОТОЙ савнуудад хийнэ. "Давс", "Перц", "Гүрмаа" гэж бичсэн. Танд "гурав дахь сав" гэсэн зүйл хэрэггүй — танд "ДАВС" хэрэгтэй, тэгээд та шууд түүн рүү очно. Энэ бол dictionary.
Жорын орцыг — жишээ нь "гурил 200г, элсэн чихэр 100г, өндөг 3ш" — та тогтмол дараалалтай, өөрчлөгдөшгүй хэлбэрээр бичнэ. Жор өөрчлөгдөхгүй. Энэ бол tuple.
Зочдын жагсаалт — хэн ирсэн бэ? Асуулт нь зөвхөн "тэр ирсэн үү, үгүй юу." Хоёр удаа ирсэн ч нэг л удаа тоологдоно, дараалал нь хамаагүй. Энэ бол set.
Гал тогооны ажилтан зөв савыг зөв зүйлд ашиглана. Хэрэв тэр амтлагчийг шуудайд хийвэл — ажиллана, гэхдээ давс олохын тулд шуудайг бүхэлд нь ухах хэрэгтэй болно. Мөн санамсаргүйгээр перцтэй хольж болно.
Бүх шийдвэрийг ганц асуултаас эхлүүлж болно: энэ өгөгдлийг би ЯАЖ АШИГЛАХ ГЭЖ БАЙНА ВЭ?
Хадгалах хэлбэр нь тэр хэрэглээнээс УРГАН гарах ёстой, эсрэгээр нь биш.
LIST — "нэг төрлийн олон зүйл, дараалалтай, өөрчлөгддөг"
Асуултууд: Хэдэн зүйл байна? Эхнийх нь юу вэ? Дараалал чухал уу? Нэмэх, хасах хэрэгтэй юу?
python
neres: list[str] = ["Болд", "Сараа", "Төмөр"]
onoo: list[int] = [85, 92, 78]
zarlaguud: list[dict[str, str | int]] = [...]TUPLE — "тогтмол бүтэцтэй бүртгэл, өөрчлөгдөшгүй"
Асуултууд: Элементийн тоо тогтмол уу? Элемент бүр өөрийн УТГАТАЙ юу (эхнийх нь нэр, хоёр дахь нь нас)? Өөрчлөгдөх ЁСГҮЙ юу?
python
tsegleg: tuple[int, int] = (10, 20)
ungu: tuple[int, int, int] = (255, 128, 0)
hun: tuple[str, int, str] = ("Болд", 25, "Улаанбаатар")SET — "давхардалгүй олонлог, хурдан харьяалал шалгах"
Асуултууд: Давхардал байх ёсгүй юу? "Энэ зүйл байна уу" гэж ОЛОН УДАА асуух уу? Дараалал хамаагүй юу?
python
uvurmuts_ugs: set[str] = {"монгол", "улс", "хот"}
zuvshuurugdsun: set[str] = {"admin", "editor"}DICTIONARY — "нэрээр хайх, key-value хос"
Асуултууд: Зүйл бүрт НЭР эсвэл ID байна уу? Тэр нэрээр нь хурдан олох хэрэгтэй юу? Зүйл бүр өөр өөр талбартай юу?
python
unes: dict[str, int] = {"ном": 15000, "утас": 800000}
suragch: dict[str, str | int] = {"ner": "Болд", "nas": 16}Практикт би дараах дарааллаар асууна.
Асуулт 1: Энэ зүйл бүр НЭРТЭЙ юу?
Хэрэв тийм бол — dictionary.
"Болдын нас", "утасны үнэ", "тохиргооны утга" — эдгээр бүгд НЭРЭЭР хандагдана. Тоогоор биш.
python
# Буруу
hun = ["Болд", 16, "10а"]
print(hun[1]) # 1 нь юу вэ? Нас уу? Санахын тулд кодоо шалгах хэрэгтэй.
# Зөв
hun = {"ner": "Болд", "nas": 16, "angi": "10а"}
print(hun["nas"]) # Өөрөө хэлж байна.Асуулт 2: Асуулт нь зөвхөн "байна уу, үгүй юу" мөн үү?
Хэрэв тийм бол, мөн ОЛОН УДАА асуух гэж байвал — set.
python
# Буруу — удаан
KHORIGLOSON: list[str] = ["үг1", "үг2", ... ] # 10,000 үг
for ug in tekst_ugs: # 100,000 үг
if ug in KHORIGLOSON: # бүр удаа 10,000 харьцуулалт!
...
# Зөв — хурдан
KHORIGLOSON: set[str] = {"үг1", "үг2", ... }
for ug in tekst_ugs:
if ug in KHORIGLOSON: # бүр удаа НЭГ алхам
...Асуулт 3: Бүтэц нь ТОГТМОЛ уу, элемент бүр өөрийн утгатай юу?
Хэрэв тийм бол — tuple.
python
# Буруу — координат нь өөрчлөгдөж болохгүй
tsegleg: list[int] = [10, 20]
tsegleg.append(30) # одоо энэ юу вэ?
# Зөв
tsegleg: tuple[int, int] = (10, 20)
tsegleg.append(30) # AttributeError — зөв!Асуулт 4: Бусад бүх тохиолдол.
List. Энэ бол анхдагч сонголт. Эргэлзвэл list ашигла.
Практикт хамгийн олон тохиолддог, хамгийн их үр дагавартай шийдвэр нь энэ.
Бодит жишээ авъя: харилцагчийн дэвтэр. Курс 1-д та түүнийг бичсэн.
Хувилбар А — dictionary-уудын жагсаалт:
python
kharilagchid: list[dict[str, str]] = [
{"ner": "Болд", "utas": "99112233"},
{"ner": "Сараа", "utas": "88445566"},
{"ner": "Төмөр", "utas": "95556677"},
]Хувилбар Б — нэрээр индексжүүлсэн dictionary:
python
kharilagchid: dict[str, str] = {
"Болд": "99112233",
"Сараа": "88445566",
"Төмөр": "95556677",
}Аль нь зөв бэ? Хамаарна. Тэр нь та ЮУ ХИЙХ гэж байгаагаас шалтгаална.
Гурван үйлдлийг харьцуулъя.
Үйлдэл 1: нэрээр хайх.
python
# Хувилбар А — жагсаалтыг гүйнэ
def khaikh(kharilagchid: list[dict[str, str]], ner: str) -> str | None:
for k in kharilagchid:
if k["ner"] == ner:
return k["utas"]
return None
# Хувилбар Б — шууд
def khaikh(kharilagchid: dict[str, str], ner: str) -> str | None:
return kharilagchid.get(ner)Хувилбар Б нь нэг мөр, мөн хамаагүй хурдан (set-тэй ижил шалтгаанаар — dictionary ч бас hash ашигладаг). Хувилбар А нь дөрвөн мөр, мөн жагсаалт томрох тусам удаашрана.
Үйлдэл 2: шинэ хүн нэмэх.
python
# Хувилбар А
kharilagchid.append({"ner": "Цэцэг", "utas": "99887766"})
# Хувилбар Б
kharilagchid["Цэцэг"] = "99887766"Хоёулаа хялбар. Гэхдээ Хувилбар Б-д нэг чухал ялгаа бий: ижил нэр давхардаж чадахгүй. Хэрэв "Болд" аль хэдийн байвал, шинэ утга хуучныг дарж бичнэ. Хувилбар А-д хоёр өөр "Болд" зэрэг оршин байж чадна.
Энэ нь давуу тал уу, сул тал уу? Хамаарна. Хэрэв нэр нь ӨВӨРМӨЦ байх ЁСТОЙ бол — Хувилбар Б нь тэр дүрмийг АВТОМАТААР хэрэгжүүлж байна. Хэрэв ижил нэртэй хоёр хүн байж болох бол — Хувилбар Б нь өгөгдөл АЛДАНА.
Үйлдэл 3: олон талбар хадгалах.
Хэрэв харилцагч бүр нэр, утас, имэйл, хаягтай байвал?
python
# Хувилбар А — байгалийн
kharilagchid: list[dict[str, str]] = [
{"ner": "Болд", "utas": "99112233", "email": "bold@жишээ.mn", "khayag": "УБ"},
]
# Хувилбар Б — dictionary дотор dictionary
kharilagchid: dict[str, dict[str, str]] = {
"Болд": {"utas": "99112233", "email": "bold@жишээ.mn", "khayag": "УБ"},
}Хоёулаа ажиллана. Хувилбар Б нь нэрээр хайхад хурдан хэвээр, гэхдээ нэр нь одоо ХОЁР газарт байна (key ба... үгүй, зөвхөн key дээр). Хувилбар А нь илүү "хавтгай" — бүх талбар нэг түвшинд.
Дүгнэлт:
Хэрэв та NЭРЭЭР хайх нь гол үйлдэл бол → dictionary (нэр нь key).
Хэрэв та бүх зүйлийг эргүүлж явах, шүүх, эрэмбэлэх нь гол үйлдэл бол → list.
Хэрэв нэр нь өвөрмөц БАЙХ ЁСТОЙ бол → dictionary нь тэр дүрмийг үнэгүй хэрэгжүүлнэ.
Эргэлзвэл → list. Түүнийг дараа нь dictionary болгож хувиргах нь хялбар.
Дашрамд, list-ээс dictionary болгох хувиргалт нь нэг мөр (Бүлэг 2-ын dict comprehension):
python
kharilagchid_list: list[dict[str, str]] = [
{"ner": "Болд", "utas": "99112233"},
{"ner": "Сараа", "utas": "88445566"},
]
nereer: dict[str, str] = {k["ner"]: k["utas"] for k in kharilagchid_list}
print(nereer){'Болд': '99112233', 'Сараа': '88445566'}Тиймээс та list-ээр эхэлж, хайлт удаашрахад dictionary болгож хувиргаж чадна. Энэ бол бүрэн зөв стратеги — эрт оптимизаци хийхээс дээр.
python
# List — дараалал чухал, давхардал зөвшөөрөгдөнө
zaakhad_irsen: list[str] = ["Болд", "Сараа", "Болд"] # Болд хоёр удаа ирсэн
# Set — давхардал байх ёсгүй
guilgee_avsan: set[str] = {"Болд", "Сараа"} # хэн авсан бэАсуулт: давхардал нь МЭДЭЭЛЭЛ мөн үү?
Хэрэв "Болд хоёр удаа ирсэн" гэдэг нь чухал бол — list. Хэрэв "Болд ирсэн" гэдэг л чухал бол — set.
Түвшин 1-ийн guided build-аас жишээ:
python
ugs: list[str] = ugend_salgakh(tekst) # LIST — давтамж тоолох хэрэгтэй
uvurmuts_too: int = len(set(ugs)) # SET — зөвхөн өвөрмөц тооХоёулаа ижил өгөгдлөөс, гэхдээ ӨӨР асуултад хариулж байна. Тиймээс ӨӨР бүтэц.
Санамж (Бүлэг 5.2-оос): тоолох, дундаж бодох, нийлбэр гаргахад set ашиглаж БОЛОХГҮЙ — тэр нь давхардлыг устгаж, мэдээлэл алддаг.
Асуулт: урт нь өөрчлөгдөх үү?
python
# List — урт хувьсамтгай
onoo: list[int] = [85, 92]
onoo.append(78) # шинэ шалгалт нэмэгдлээ
# Tuple — урт тогтмол
tsegleg: tuple[int, int] = (10, 20)
# гурав дахь тоо нэмэх нь УТГАГҮЙМөн: элемент бүр өөр УТГАТАЙ юу?
python
# List — бүх элемент ижил утгатай (бүгд оноо)
onoo: list[int] = [85, 92, 78]
# Tuple — элемент бүр өөр утгатай
hun: tuple[str, int, str] = ("Болд", 25, "Улаанбаатар")Гэхдээ энд ЧУХАЛ зөвлөгөө: хэрэв tuple-д гурваас олон элемент байвал, эсвэл та "хоёр дахь элемент нь юу байсан билээ" гэж бодож эхэлбэл — та dictionary эсвэл dataclass ашиглах ёстой байсан.
python
# Муу — юу нь юу вэ?
hun: tuple[str, int, str, str, bool] = ("Болд", 25, "УБ", "99112233", True)
print(hun[3]) # энэ юу вэ??
# Дээр — dictionary
hun: dict[str, str | int | bool] = {
"ner": "Болд",
"nas": 25,
"hot": "УБ",
"utas": "99112233",
"idevkhtei": True,
}
print(hun["utas"]) # тодорхой
# Хамгийн сайн — dataclass (Бүлэг 9)
@dataclass
class Hun:
ner: str
nas: int
hot: str
utas: str
idevkhtei: bool
print(hun.utas) # хамгийн тодорхойTuple нь хоёр, гурван элементтэй үед л сайн ажилладаг. Түүнээс олон бол — нэрлэсэн бүтэц хэрэгтэй.
Хэрэв та dictionary сонгосон бол, дараагийн асуулт: key нь юу байх вэ?
Дүрэм: key нь ӨВӨРМӨЦ, ТОГТМОЛ байх ёстой.
python
# Муу — нэр нь өвөрмөц биш (ижил нэртэй хоёр хүн байж болно)
suragchid: dict[str, dict[str, int]] = {
"Болд": {"nas": 16},
"Болд": {"nas": 17}, # эхнийхийг ДАРЖ бичнэ! Өгөгдөл алдагдлаа.
}
# Зөв — ID нь өвөрмөц
suragchid: dict[int, dict[str, str | int]] = {
1001: {"ner": "Болд", "nas": 16},
1002: {"ner": "Болд", "nas": 17}, # өөр хүн, өөр ID
}Мөн key нь immutable байх ёстой (Бүлэг 5.1, 5.2-оос): string, тоо, tuple. List, dictionary болохгүй.
Tuple-key нь маш хүчирхэг (Бүлэг 5.1-ээс):
python
zardal: dict[tuple[str, str], int] = {
("2026-01", "хоол"): 450000,
("2026-01", "тээвэр"): 120000,
}Key нь ХОСЛОЛ байх үед энэ бол хамгийн цэвэрхэн шийдэл.
Одоо шийдвэрийн процессыг БОДИТ асуудал дээр харуулъя. Дараагийн бүлэгт та зарлагын бүртгэлийн программ бичнэ. Өгөгдлөө яаж бүтцэлэх вэ?
Шаардлагууд:
Зарлага бүрд нэр, дүн, ангилал байна
Шинэ зарлага нэмнэ
Бүх зарлагыг жагсаана
Нийт дүнг тооцоолно
Ангилалаар шүүнэ
Шийдвэр:
Зарлага НЭГ БҮР нь олон талбартай (нэр, дүн, ангилал) → зарлага бүр нь dictionary.
Зарлага ОЛОН байна, шинэ нь нэмэгдэнэ, бүгдийг эргүүлж явах хэрэгтэй → тэдгээрийн цуглуулга нь list.
Зарлага бүр өвөрмөц нэртэй байх шаардлагагүй (та "Ном" гэсэн зарлага хоёр удаа хийж болно) → dictionary-key ашиглахгүй.
python
zarlaguud: list[dict[str, str | int]] = [
{"ner": "Ном", "dun": 15000, "angilal": "боловсрол"},
{"ner": "Автобус", "dun": 1000, "angilal": "тээвэр"},
{"ner": "Ном", "dun": 22000, "angilal": "боловсрол"},
]Одоо үйлдлүүд нь бүгд байгалийн:
python
# Нэмэх
zarlaguud.append({"ner": "Хоол", "dun": 8000, "angilal": "хоол"})
# Нийт дүн
niit = sum(z["dun"] for z in zarlaguud)
# Ангилалаар шүүх
bolovsrol = [z for z in zarlaguud if z["angilal"] == "боловсрол"]
# Ангилал бүрийн нийт дүн
angilal_dun: dict[str, int] = {}
for z in zarlaguud:
angilal_dun[z["angilal"]] = angilal_dun.get(z["angilal"], 0) + z["dun"]Сүүлчийн хэсгийг анзаараарай: тэнд ШИНЭ dictionary үүсэж байна — учир нь тэр нь өөр асуултад хариулж байна ("ангилал бүрд хэдэн төгрөг?"). Нэг өгөгдлөөс ялгаатай асуултад хариулахын тулд ялгаатай бүтэц үүсгэх нь бүрэн зөв.
Шаардлагууд:
API-аас өгөгдөл ирнэ (JSON — dictionary)
Хэдэн хотын мэдээлэл хадгална
Хотоор нь хурдан хайна
Шийдвэр:
API-аас ирэх өгөгдөл нь dictionary (JSON тийм хэлбэртэй, өөр сонголт байхгүй).
Хотуудыг НЭРЭЭР нь хайна → dictionary, key нь хотын нэр.
python
tsag_agaar: dict[str, dict[str, float | str]] = {
"Улаанбаатар": {"temperatur": -12.5, "baidal": "цэлмэг"},
"Дархан": {"temperatur": -10.0, "baidal": "үүлшинэ"},
}
print(tsag_agaar["Улаанбаатар"]["temperatur"])-12.5Хэрэв та зөвхөн НЭГ хотын мэдээлэл авах гэж байгаа бол — жагсаалт огт хэрэггүй, зүгээр л нэг dictionary:
python
hariult: dict[str, float | str] = {"temperatur": -12.5, "baidal": "цэлмэг"}Хамгийн энгийн бүтэц нь ажиллаж байвал — түүнийг сонго. Хэрэггүй давхарга нэмэх нь эрт оптимизаци шиг муу зүйл.
Шаардлагууд:
Ном бүр гарчиг, зохиолч, ISBN-тэй
Гишүүн бүр нэр, ID-тай
Хэн ямар номыг зээлсэн бэ
ISBN-ээр ном хурдан хайна
Шийдвэр:
Ном нь олон талбартай, ISBN нь ӨВӨРМӨЦ → dictionary, key нь ISBN.
python
nomnuud: dict[str, dict[str, str]] = {
"978-1": {"garchig": "Монголын нууц товчоо", "zokhiolch": "Тодорхойгүй"},
"978-2": {"garchig": "Цагаан хэрэм", "zokhiolch": "Б. Ринчен"},
}Гишүүн бүр ID-тай → dictionary, key нь ID.
Хэн юу зээлсэн бэ? Гишүүн НЭГ БҮР олон ном зээлж болно → dictionary, key нь гишүүний ID, value нь ISBN-үүдийн жагсаалт (эсвэл set!).
python
zeel: dict[int, set[str]] = {
1001: {"978-1", "978-2"},
1002: set(),
}Яагаад set вэ, list биш? Учир нь нэг гишүүн ижил номыг ХОЁР УДАА зээлж чадахгүй — давхардал нь утгагүй. Set нь тэр дүрмийг автоматаар хэрэгжүүлнэ. Мөн "энэ гишүүн энэ номыг зээлсэн үү" гэсэн шалгалт хурдан болно.
Энэ бол зөв бүтэц сонгох нь дүрмийг ҮНЭГҮЙ хэрэгжүүлдгийн жишээ. Хэрэв та list ашигласан бол if isbn not in zeel[id] гэж гараар шалгаж, дараа нь append хийх байсан. Set нь тэр логикийг өөртөө агуулж байна.
(Бүлэг 9-д бид энэ бүхнийг dataclass ашиглан дахин бичиж, бүр ч цэвэрхэн болгоно. Гэхдээ бүтцийн шийдвэр нь ижил хэвээр үлдэнэ.)
Асуулт | Хариулт |
|---|---|
Зүйл бүр НЭРТЭЙ юу? | dictionary |
"Байна уу?" гэж олон удаа асуух уу? | set |
Бүтэц тогтмол, элемент бүр өөр утгатай юу? (2-3 ширхэг) | tuple |
Нэг төрлийн олон зүйл, дараалалтай? | list |
Эргэлзэж байна уу? | list |
Хэрэгцээ | Бүтэц |
|---|---|
Нэрээр хурдан хайх |
|
Давхардал устгах |
|
Дараалал хадгалж, нэмэх/хасах |
|
Координат, RGB, огноо |
|
Олон талбартай нэг зүйл |
|
Олон талбартай ОЛОН зүйл |
|
ID-гаар индексжүүлсэн олон зүйл |
|
Хосолсон key (сар + ангилал) |
|
Эцэст нь нэг зүйлийг чөлөөлж хэлье: та эхнээсээ төгс сонголт хийх шаардлагагүй.
Программ бичиж эхлэхэд та бүх хэрэглээгээ мэдэхгүй байдаг. List-ээр эхлээрэй. Хэрэв хайлт удаашрахад — dictionary болгож хувирга. Хэрэв давхардал асуудал болбол — set нэмээрэй.
Хувиргалт нь ихэвчлэн НЭГ МӨР:
python
# List → dictionary
nereer = {k["ner"]: k for k in kharilagchid}
# List → set
uvurmuts = set(neres)
# Dictionary → list
jagsaalt = list(unes.items())
# Set → эрэмбэлсэн list
erembelsen = sorted(uvurmuts)Эрт оптимизаци хийх нь эхлэгчдийн түгээмэл алдаа. Хамгийн энгийнээр эхэл. Асуудал гарвал — тэр үед засаарай. Асуудал гарахгүй бол — та цаг хэмнэлээ.
Гэхдээ ГАНЦ үл хамаарах зүйл бий: хэрэв өгөгдөл бүр НЭРТЭЙ талбартай бол, эхнээсээ dictionary ашигла. hun[0], hun[1] гэсэн кодыг дараа нь засах нь маш их ажил. Тэр сонголтыг эхнээс нь зөв хийвэл дээр.
Хэрэв сонирхвол: дараах өгөгдөл бүрд ямар бүтэц тохирохыг бодоод, дараа нь өөрийн хариултаа шалгаарай.
Сарын өдрүүдийн нэрс (Даваа, Мягмар, ...)
Хэрэглэгчийн профайл (нэр, имэйл, нас, хот)
Дэлгүүрийн бүх барааны үнэ (нэрээр хайх)
Тоглоомд оноо авсан бүх тоглогчийн нэрс (хэн ч байсан нэг л удаа тоологдоно)
Шатрын самбар дээрх хүүхнүүдийн байрлал
Ном унших дараалал (эхнийх нь, хоёр дахь нь...)
Санал болгох хариултууд: 1 → list[str] (дараалал чухал). 2 → dict[str, ...] (талбар бүр нэртэй). 3 → dict[str, int] (нэрээр хайна). 4 → set[str] (давхардалгүй). 5 → dict[tuple[int, int], str] (координат-key!). 6 → list[str] (дараалал чухал).
Хэрэв таны хариулт өөр байвал — тэр буруу гэсэн үг биш. Хэрэглээ өөр бол бүтэц ч өөр байна. Гол нь ЯАГААД гэдгээ тайлбарлаж чадах эсэх юм.
1. Бүх зүйлд list ашиглах
python
hun = ["Болд", 25, "УБ"]
print(hun[2]) # энэ юу вэ?Хэрэв элемент бүр өөр утгатай бол — dictionary эсвэл tuple. hun[2] гэсэн код нь зургаан сарын дараа танд юу ч хэлэхгүй.
2. Хайлтын хэрэгцээг хожуу анзаарах
python
kharilagchid: list[dict[str, str]] = [... 10,000 хүн ...]
for ner in khaikh_neres: # 1,000 нэр
for k in kharilagchid: # 10,000 хүн — БҮР УДАА
if k["ner"] == ner:
...Арван сая харьцуулалт. Dictionary болгож хувиргавал арван мянга. Засвар: эхлээд индекс үүсгэ.
python
nereer: dict[str, dict[str, str]] = {k["ner"]: k for k in kharilagchid}
for ner in khaikh_neres:
k = nereer.get(ner)
if k is not None:
...3. Set-ийг тоолоход ашиглах
Бүлэг 5.2-оос: set нь давхардлыг устгадаг тул sum, len, дундаж бодоход мэдээлэл алддаг.
4. Хэт олон элементтэй tuple
python
hun: tuple[str, int, str, str, bool, int, str] = (...)
print(hun[4]) # ??Гурваас олон бол dictionary эсвэл dataclass.
5. Өөрчлөгддөг зүйлийг key болгох
TypeError: unhashable type: 'list'Key нь immutable байх ёстой: string, тоо, tuple.
Бүтцийн сонголт нь ХЭРЭГЛЭЭНЭЭС урган гарна, эсрэгээр биш. "Би энэ өгөгдлийг яаж ашиглах вэ?" гэж эхлээд асуу.
Dictionary — зүйл бүр НЭРТЭЙ, нэрээр нь ХУРДАН хайх.
Set — давхардалгүй, "байна уу?" гэж олон удаа асуух.
Tuple — тогтмол бүтэц, өөрчлөгдөшгүй, 2-3 элемент.
List — нэг төрлийн олон зүйл, дараалалтай. Анхдагч сонголт.
Хамгийн чухал шийдвэр: list vs dictionary. Нэрээр хайх нь гол үйлдэл бол → dictionary. Бүгдийг эргүүлж явах нь гол бол → list.
Key нь өвөрмөц ба immutable байх ёстой. Tuple-key нь хосолсон түлхүүрт (сар + ангилал) хамгийн цэвэрхэн.
Зөв бүтэц нь дүрмийг ҮНЭГҮЙ хэрэгжүүлдэг. Set нь давхардлыг, dictionary нь өвөрмөц байдлыг автоматаар хангана.
Эрт оптимизаци бүү хий. List-ээр эхэл, шаардлагатай бол хувирга — ихэнх хувиргалт нэг мөр.
Гэхдээ: өгөгдөл бүр нэртэй талбартай бол — эхнээсээ dictionary. hun[0] гэсэн кодыг дараа нь засах нь их ажил.
Бүлэг 5 дууслаа. Та одоо Python-ы дөрвөн үндсэн бүтцийг бүгдийг нь мэдэж, тэдгээрийн хооронд ухаалаг сонголт хийж чадна. Мөн үүрлэсэн бүтэцтэй айхгүй ажиллаж чадна.
Бүлэг 6-д бид тэр мэдлэгээ ГАДАГШ гаргана. JSON гэж юу вэ — программууд хоорондоо ярих нийтлэг хэл. Python-ы json модуль ашиглан файлд бичих, файлаас унших. CSV формат ба Excel-ийн экспорт. Дараа нь Түвшин 2-ын guided build: зарлагын бүртгэл — JSON файлд хадгалдаг, бүрэн type hint-тэй, Курс 1-ийн хийх ажлын жагсаалтын жинхэнэ өв залгамжлагч.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.