შიგთავსზე გადასვლა

📘 Set და Dictionary - Python-ის მონაცემთა სტრუქტურები

📑 სარჩევი

  1. შესავალი
  2. სიმრავლე (Set)
  3. ლექსიკონი (Dictionary)
  4. შედარება
  5. პრაქტიკული ამოცანები

🔰 შესავალი

Python-ში მონაცემთა სტრუქტურები გვეხმარება ინფორმაციის ორგანიზებულად შენახვასა და დამუშავებაში. ძირითადი ტიპებია:

  • list — სია (მაგ: [1, 2, 3])
  • tuple — ტუპლი (მაგ: (1, 2, 3))
  • set — სიმრავლე (მაგ: {1, 2, 3})
  • dictionary — ლექსიკონი (მაგ: {"name": "Ana"})

ამ სახელმძღვანელოში დეტალურად განვიხილავთ Set და Dictionary-ს.


🔷 სიმრავლე (Set)

📌 რა არის Set?

Set არის უნიკალური ელემენტების კოლექცია - მათემატიკური სიმრავლის ანალოგი პროგრამირებაში.

🔑 ძირითადი მახასიათებლები:

უნიკალურობა - არ ინახავს დუბლირებულ ელემენტებს
დაულაგებელი - ელემენტების რიგი არ არის მნიშვნელოვანი
ინდექსაცია არ მუშაობს - set[0] გამოიწვევს შეცდომას
ცვალებადი - შეგიძლია დაამატო ან წაშალო ელემენტები


🛠️ Set-ის შექმნა

# უბრალო set
fruits = {"apple", "banana", "orange"}
numbers = {1, 2, 3, 4, 5}

# ცარიელი set
empty_set = set()  # სწორი
# empty_set = {}   # ❌ ეს ქმნის ცარიელ dictionary-ს!

# list-იდან set-ის შექმნა (დუბლიკატები ავტომატურად იშლება)
my_list = [1, 2, 2, 3, 3, 3]
unique_numbers = set(my_list)  # {1, 2, 3}

➕ ელემენტების დამატება

fruits = {"apple", "banana"}

# ერთი ელემენტის დამატება
fruits.add("mango")
print(fruits)  # {"apple", "banana", "mango"}

# რამდენიმე ელემენტის დამატება
fruits.update(["kiwi", "grape"])
print(fruits)  # {"apple", "banana", "mango", "kiwi", "grape"}

➖ ელემენტების წაშლა

fruits = {"apple", "banana", "orange"}

# remove() - თუ ელემენტი არ არსებობს, მოხდება შეცდომა
fruits.remove("banana")  # ✅ მუშაობს
# fruits.remove("mango")  # ❌ KeyError!

# discard() - უსაფრთხო, შეცდომას არ იძლევა
fruits.discard("orange")  # ✅ მუშაობს
fruits.discard("mango")   # ✅ შეცდომა არ ხდება

# pop() - შემთხვევითი ელემენტის ამოღება
removed = fruits.pop()
print(f"ამოღებულია: {removed}")

# clear() - სრულად გასუფთავება
fruits.clear()
print(fruits)  # set()

🔍 Set-ში შემოწმება

fruits = {"apple", "banana", "orange"}

# ელემენტის არსებობის შემოწმება
if "apple" in fruits:
    print("ვაშლი არის set-ში")

if "mango" not in fruits:
    print("მანგო არ არის set-ში")

# set-ის ზომა
print(len(fruits))  # 3

🧮 Set-ის ოპერაციები

A = {1, 2, 3, 4}
B = {3, 4, 5, 6}

# 1️⃣ გაერთიანება (Union) - ყველა ელემენტი ორივე სიმრავლიდან
union = A | B
# ან: union = A.union(B)
print(union)  # {1, 2, 3, 4, 5, 6}

# 2️⃣ გადაკვეთა (Intersection) - მხოლოდ საერთო ელემენტები
intersection = A & B
# ან: intersection = A.intersection(B)
print(intersection)  # {3, 4}

# 3️⃣ სხვაობა (Difference) - A-ში არსებული, B-ში არა
difference = A - B
# ან: difference = A.difference(B)
print(difference)  # {1, 2}

# 4️⃣ სიმეტრიული სხვაობა - ელემენტები რომლებიც მხოლოდ ერთშია
sym_diff = A ^ B
# ან: sym_diff = A.symmetric_difference(B)
print(sym_diff)  # {1, 2, 5, 6}

# 5️⃣ ქვესიმრავლე (Subset)
C = {1, 2}
print(C.issubset(A))  # True - C არის A-ს ქვესიმრავლე

# 6️⃣ ზესიმრავლე (Superset)
print(A.issuperset(C))  # True - A არის C-ს ზესიმრავლე

💡 Set-ის პრაქტიკული გამოყენება

# მაგალითი 1: დუბლიკატების ამოღება
emails = ["[email protected]", "[email protected]", "[email protected]", "[email protected]"]
unique_emails = list(set(emails))
print(unique_emails)  # უნიკალური ელემენტები

# მაგალითი 2: საერთო მეგობრების პოვნა
ana_friends = {"Gio", "Nika", "Lika"}
gio_friends = {"Ana", "Nika", "Saba"}
common = ana_friends & gio_friends
print(f"საერთო მეგობრები: {common}")  # {'Nika'}

# მაგალითი 3: ლუწი რიცხვების გაფილტვრა
numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
odd_numbers = {x for x in numbers if x % 2 != 0}
print(odd_numbers)  # {1, 3, 5, 7, 9}

🔶 ლექსიკონი (Dictionary)

📌 რა არის Dictionary?

Dictionary არის key:value წყვილების კოლექცია - როგორც რეალურ ლექსიკონში სიტყვა-განმარტება.

🔑 ძირითადი მახასიათებლები:

Key უნიკალურია - ერთი key ერთი value
Value განმეორებადი - სხვადასხვა key-ს შეიძლება ჰქონდეს ერთი value
Key უცვლადი - უნდა იყოს: string, number, tuple
დალაგებული (Python 3.7+) - ინახავს ელემენტების რიგს


🛠️ Dictionary-ის შექმნა

# მარტივი dictionary
student = {
    "name": "გიორგი",
    "age": 21,
    "faculty": "Computer Science",
    "grade": 95
}

# ცარიელი dictionary
empty_dict = {}
# ან: empty_dict = dict()

# dict() კონსტრუქტორით
person = dict(name="ანა", age=20, city="თბილისი")

# list-ებიდან dictionary
keys = ["name", "age", "city"]
values = ["ნიკა", 22, "ბათუმი"]
info = dict(zip(keys, values))
print(info)  # {'name': 'ნიკა', 'age': 22, 'city': 'ბათუმი'}

🔍 ელემენტებზე წვდომა

student = {
    "name": "გიორგი",
    "age": 21,
    "faculty": "IT"
}

# წვდომა key-ით (თუ key არ არსებობს → შეცდომა)
print(student["name"])  # "გიორგი"
# print(student["grade"])  # ❌ KeyError!

# get() მეთოდი (უსაფრთხო, შეცდომას არ იძლევა)
print(student.get("age"))  # 21
print(student.get("grade"))  # None
print(student.get("grade", 0))  # 0 (default მნიშვნელობა)

✏️ ელემენტების შეცვლა და დამატება

student = {"name": "ანა", "age": 20}

# არსებული value-ის შეცვლა
student["age"] = 21
print(student)  # {"name": "ანა", "age": 21}

# ახალი key:value-ის დამატება
student["grade"] = 97
student["faculty"] = "Engineering"
print(student)
# {"name": "ანა", "age": 21, "grade": 97, "faculty": "Engineering"}

# რამდენიმე ელემენტის ერთდროულად დამატება
student.update({"city": "თბილისი", "year": 2})

❌ ელემენტების წაშლა

student = {
    "name": "ნიკა",
    "age": 22,
    "grade": 88,
    "city": "ბათუმი"
}

# del - key-ის წაშლა (თუ არ არსებობს → შეცდომა)
del student["city"]

# pop() - key-ის წაშლა და value-ის დაბრუნება
grade = student.pop("grade")
print(f"წაშლილი ქულა: {grade}")

# popitem() - ბოლო წყვილის წაშლა და დაბრუნება
last = student.popitem()
print(f"ბოლო წყვილი: {last}")

# clear() - სრულად გასუფთავება
student.clear()
print(student)  # {}

🔧 Dictionary-ის მეთოდები

student = {
    "name": "ლიკა",
    "age": 20,
    "faculty": "Medicine",
    "grade": 92
}

# 1️⃣ keys() - ყველა key
keys = student.keys()
print(keys)  # dict_keys(['name', 'age', 'faculty', 'grade'])
print(list(keys))  # list-ად გადაყვანა

# 2️⃣ values() - ყველა value
values = student.values()
print(list(values))  # ['ლიკა', 20, 'Medicine', 92]

# 3️⃣ items() - ყველა key:value წყვილი
items = student.items()
for key, value in items:
    print(f"{key}: {value}")

# 4️⃣ copy() - dictionary-ის ასლი
student_copy = student.copy()

# 5️⃣ setdefault() - თუ key არ არსებობს, ქმნის მას
student.setdefault("city", "თბილისი")
print(student["city"])  # "თბილისი"

🔁 Dictionary-ით მუშაობა (Loops)

prices = {
    "ძროხა": 50,
    "დათვი": 100,
    "ბაჯი": 30,
    "ცხვარი": 25
}

# key-ებით გადავლა
for animal in prices:
    print(animal)

# key-value წყვილებით გადავლა
for animal, price in prices.items():
    print(f"{animal}: {price} ლარი")

# მხოლოდ value-ებით
for price in prices.values():
    print(f"ფასი: {price}")

# ფილტრაცია
cheap_animals = {k: v for k, v in prices.items() if v < 40}
print(cheap_animals)  # {'ბაჯი': 30, 'ცხვარი': 25}

💡 Dictionary-ის პრაქტიკული გამოყენება

# მაგალითი 1: სტუდენტების მონაცემები
students = [
    {"name": "ანა", "age": 20, "grade": 95},
    {"name": "გიო", "age": 21, "grade": 88},
    {"name": "ნიკა", "age": 19, "grade": 92}
]

# სახელების ამოღება
names = [student["name"] for student in students]
print(names)

# საშუალო ქულა
average = sum(s["grade"] for s in students) / len(students)
print(f"საშუალო ქულა: {average}")

# მაგალითი 2: მარაგის მართვა
inventory = {
    "ვაშლი": 50,
    "ბანანი": 30,
    "ფორთოხალი": 45
}

# პროდუქტის დამატება
inventory["კივი"] = 20

# რაოდენობის გაზრდა
inventory["ვაშლი"] += 10

# მინიმალური რაოდენობის პოვნა
min_product = min(inventory, key=inventory.get)
print(f"ყველაზე ცოტა: {min_product} ({inventory[min_product]} ცალი)")

# მაგალითი 3: ორი dictionary-ის გაერთიანება
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
dict1.update(dict2)
print(dict1)  # {'a': 1, 'b': 2, 'c': 3, 'd': 4}

# Python 3.9+
combined = dict1 | dict2

🔄 Set vs Dictionary - შედარება

მახასიათებელი Set Dictionary
სტრუქტურა ელემენტების კოლექცია key:value წყვილები
სინტაქსი {1, 2, 3} {"a": 1, "b": 2}
დუბლიკატები არ შეიძლება key-არა, value-კი
წვდომა ელემენტზე პირდაპირ არა key-ით
დალაგება არა კი (Python 3.7+)
ინდექსაცია არა არა (key-ით კი)
გამოყენება ოპერაციები, უნიკალურობა მონაცემების სტრუქტურირებული შენახვა
ცვალებადობა კი კი

🧩 პრაქტიკული ამოცანები

📝 Set ამოცანები (1-15)

  1. შექმნა და დამატება: შექმენი set, დაამატე 2 ახალი ელემენტი
  2. წაშლა remove()-ით: წაშალე ელემენტი remove() მეთოდით
  3. უსაფრთხო წაშლა: გამოიყენე discard() ისე, რომ შეცდომა არ მოხდეს
  4. გადაკვეთა: იპოვე ორი set-ის გადაკვეთა
  5. გაერთიანება: გააერთიანე ორი set
  6. სხვაობა: იპოვე ორი set-ის სხვაობა
  7. შემოწმება: შეამოწმე არის თუ არა ელემენტი set-ში
  8. ფილტრაცია: set-ში ჩაწერე 10 რიცხვი, წაშალე ყველა ლუწი
  9. სიმეტრიული სხვაობა: იპოვე ორი set-ის სიმეტრიული სხვაობა
  10. ასლი: შექმენი set-ის ასლი copy() მეთოდით
  11. დუბლიკატების ამოღება: list-იდან გააკეთე set და ამოიღე დუბლიკატები
  12. ქვესიმრავლე: შეამოწმე არის თუ არა ერთი set მეორის ქვესიმრავლე
  13. შემთხვევითი ამოღება: გამოიყენე pop() ელემენტის ამოსაღებად
  14. გასუფთავება: გაასუფთავე set clear() მეთოდით
  15. კონვერტაცია: list → set (უნიკალური) → list

📝 Dictionary ამოცანები (16-30)

  1. შექმნა: შექმენი dictionary სტუდენტის შესახებ
  2. დამატება: დაამატე ახალი ველი "grade"
  3. შეცვლა: შეცვალე "age" მნიშვნელობა
  4. წაშლა: წაშალე ერთი key:value წყვილი
  5. Keys: დაბეჭდე ყველა key
  6. Values: დაბეჭდე ყველა value
  7. Items: დაბეჭდე ყველა key:value წყვილი
  8. მრავალი სტუდენტი: შექმენი 3 სტუდენტის dictionary, დაბეჭდე მხოლოდ სახელები
  9. საშუალო ფასი: ჩაწერე ნივთები და ფასები, იპოვე საშუალო
  10. მარაგი: შექმენი საწყობი (პროდუქტი→რაოდენობა)
  11. განახლება: გაზარდე პროდუქტის რაოდენობა
  12. მინიმუმი: იპოვე მინიმალური value
  13. Keys → List: გადაიყვანე keys list-ად
  14. Values → List: გადაიყვანე values list-ად
  15. გაერთიანება: გააერთიანე ორი dictionary update() მეთოდით

✅ პასუხები

Set ამოცანები (1-15)

# 1. შექმნა და დამატება
s = {1, 2, 3}
s.add(4)
s.add(5)
print(s)  # {1, 2, 3, 4, 5}

# 2. წაშლა remove()-ით
s = {1, 2, 3, 4, 5}
s.remove(2)
print(s)  # {1, 3, 4, 5}

# 3. უსაფრთხო წაშლა discard()-ით
s.discard(100)  # შეცდომა არ ხდება
s.discard(3)
print(s)

# 4. გადაკვეთა
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}
intersection = A & B  # ან A.intersection(B)
print(intersection)  # {3, 4}

# 5. გაერთიანება
union = A | B  # ან A.union(B)
print(union)  # {1, 2, 3, 4, 5, 6}

# 6. სხვაობა
difference = A - B  # ან A.difference(B)
print(difference)  # {1, 2}

# 7. შემოწმება
print("x" in s)  # False
print(1 in s)  # True

# 8. ლუწების წაშლა
numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
odd_only = {x for x in numbers if x % 2 != 0}
print(odd_only)  # {1, 3, 5, 7, 9}

# 9. სიმეტრიული სხვაობა
sym_diff = A ^ B  # ან A.symmetric_difference(B)
print(sym_diff)  # {1, 2, 5, 6}

# 10. ასლის შექმნა
s = {1, 2, 3}
new_s = s.copy()
print(new_s)

# 11. დუბლიკატების ამოღება
my_list = [1, 2, 2, 3, 3, 3, 4]
unique = set(my_list)
print(unique)  # {1, 2, 3, 4}

# 12. ქვესიმრავლის შემოწმება
A = {1, 2, 3, 4}
B = {1, 2}
print(B.issubset(A))  # True
print(A.issuperset(B))  # True

# 13. pop() - შემთხვევითი ელემენტის ამოღება
s = {1, 2, 3, 4}
x = s.pop()
print(f"ამოღებულია: {x}")
print(s)

# 14. გასუფთავება
s = {1, 2, 3}
s.clear()
print(s)  # set()

# 15. list → set → list
lst = [1, 2, 2, 3, 3, 4]
lst = list(set(lst))
print(lst)  # [1, 2, 3, 4]

Dictionary ამოცანები (16-30)

# 16. სტუდენტის შექმნა
student = {"name": "ანა", "age": 20}
print(student)

# 17. grade-ის დამატება
student["grade"] = 95
print(student)

# 18. age-ის შეცვლა
student["age"] = 21
print(student)

# 19. წყვილის წაშლა
student.pop("grade")
# ან: del student["grade"]
print(student)

# 20. ყველა key
student = {"name": "გიო", "age": 22, "faculty": "IT"}
print(student.keys())  # dict_keys(['name', 'age', 'faculty'])
print(list(student.keys()))  # ['name', 'age', 'faculty']

# 21. ყველა value
print(student.values())
print(list(student.values()))

# 22. ყველა წყვილი
print(student.items())
for key, value in student.items():
    print(f"{key}: {value}")

# 23. მრავალი სტუდენტი - მხოლოდ სახელები
students = [
    {"name": "გიო", "age": 20},
    {"name": "ნიკა", "age": 22},
    {"name": "ანა", "age": 21}
]
names = [s["name"] for s in students]
print(names)  # ['გიო', 'ნიკა', 'ანა']

# 24. საშუალო ფასი
prices = {"რძე": 3, "პური": 2, "ყველი": 8}
avg = sum(prices.values()) / len(prices)
print(f"საშუალო ფასი: {avg:.2f}")  # 4.33

# 25. საწყობის შექმნა
store = {"ვაშლი": 10, "ბანანი": 20}
print(store)

# 26. რაოდენობის გაზრდა
store["ვაშლი"] += 5
print(store)  # {"ვაშლი": 15, "ბანანი": 20}

# 27. მინიმალური value
min_value = min(store.values())
print(f"მინიმალური რაოდენობა: {min_value}")

# 28. keys → list
keys_list = list(store.keys())
print(keys_list)

# 29. values → list
values_list = list(store.values())
print(values_list)

# 30. ორი dictionary-ის გაერთიანება
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
dict1.update(dict2)
print(dict1)  # {'a': 1, 'b': 2, 'c': 3, 'd': 4}

# ან Python 3.9+:
# combined = dict1 | dict2

🎯 დამატებითი რჩევები

Set-ისთვის:

  • გამოიყენე დუბლიკატების ამოსაღებად list-იდან
  • იდეალურია ელემენტების არსებობის სწრაფი შესამოწმებლად
  • მათემატიკური ოპერაციები (გადაკვეთა, გაერთიანება) ძალიან სწრაფია

Dictionary-ისთვის:

  • იდეალურია სტრუქტურირებული მონაცემებისთვის
  • გამოიყენე მონაცემთა დაჯგუფებისთვის და დათვლისთვის
  • get() უსაფრთხოა, [] უფრო პირდაპირი

📚 დამატებითი რესურსები


🚀