Множини та кортежі
Перш ніж перейти до множин і кортежів, важливо зазначити, що словники тут розглядатися не будуть.
Множина
Множина забезпечує середню складність O(1) для вставки, видалення та пошуку, тобто ці операції виконуються за сталий час незалежно від розміру множини. Це робить множини значно швидшими за списки для перевірки наявності елемента та операцій додавання чи видалення, де списки мають складність O(n) (час зростає лінійно із розміром списку) у найгіршому випадку.
Коли використовувати:
- Потрібні унікальні елементи, що гарантує відсутність дублікатів у колекції;
- Необхідна швидка перевірка наявності елемента, що робить множини ідеальними для завдань на перевірку існування елемента;
- Виконуються операції, такі як об'єднання, перетин або різниця множин, які підтримуються оптимізованими методами;
- Порядок не має значення, оскільки множини не впорядковані й немає потреби зберігати порядок додавання.
1234567891011121314151617181920# Removing duplicates from a list using a set numbers = [1, 3, 2, 3, 5, 4, 5] unique_numbers = set(numbers) print(f'Unique Numbers: {unique_numbers}') # Fast membership testing names = {'Alice', 'Bob', 'Charlie'} print(f'Is Alice in the set? {"Alice" in names}') print(f'Is Eve in the set? {"Eve" in names}') # Set operations: union, intersection, and difference set_a = {1, 4, 3, 2} set_b = {3, 5, 4, 6} print(f'Union: {set_a.union(set_b)}') print(f'Intersection: {set_a.intersection(set_b)}') print(f'Difference: {set_a.difference(set_b)}') # Removing elements from a set safely with discard names.discard('Alice') # Safe removal, no error if the element doesn't exist print(f'Names after removal: {names}')
Тепер порівняймо продуктивність множини та списку при перевірці наявності елемента:
12345678910111213141516171819import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator # Create a large list and set with the same elements large_list = list(range(10000000)) large_set = set(large_list) # Test membership for an element at the end element_to_find = 9999999 @timeit_decorator(number=50) def test_membership(element, collection): return element in collection print('List:') print(test_membership(element_to_find, large_list)) print('Set:') print(test_membership(element_to_find, large_set))
Кортеж
Кортежі зазвичай використовуються, коли потрібно гарантувати незмінність даних або використовувати їх як ключ у dict чи елемент у set (оскільки кортежі є хешованими).
-
Краще за списки: коли потрібні незмінні дані, необхідно використовувати колекцію як ключ словника або елемент множини, або коли потрібне ефективне використання пам’яті для фіксованої кількості елементів;
-
Краще за NumPy-масиви: коли дані є нечисловими або коли важлива незмінність. NumPy-масиви призначені для числових обчислень і за замовчуванням змінні, тоді як кортежі забезпечують безпеку для нечислових даних або невеликих структурованих колекцій, які мають залишатися постійними.
12345678# Each tuple in the list represents an immutable student record students = [ (1834, 'James', 'Johnson'), (2749, 'Alice', 'Smith'), (4923, 'Bob', 'Brown') ] # Attempting to modify a tuple will raise a TypeError students[0][1] = 'Fred'
Оскільки список students містить записи студентів (ID, ім'я, прізвище), які мають бути тільки для читання, доцільніше використовувати кортежі для кожного запису замість списків. Крім того, як зазначено вище, кортежі трохи більш ефективні за використанням пам'яті порівняно зі списками.
1. Який із наступних сценаріїв найкраще підходить для використання множини замість списку?
2. У вас є набір даних із мільйонами записів, і потрібно часто перевіряти, чи існують у ньому певні значення. Яка структура даних є найбільш ефективною для цієї мети?
3. Ви створюєте запис для кожного студента, який містить унікальний ідентифікатор, ім'я та прізвище. Дані не повинні змінюватися після створення. Яка структура даних буде найбільш доречною?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you explain more about when to use sets versus lists?
What are some common use cases for tuples?
Can you show more examples of set operations?
Awesome!
Completion rate improved to 7.69
Множини та кортежі
Свайпніть щоб показати меню
Перш ніж перейти до множин і кортежів, важливо зазначити, що словники тут розглядатися не будуть.
Множина
Множина забезпечує середню складність O(1) для вставки, видалення та пошуку, тобто ці операції виконуються за сталий час незалежно від розміру множини. Це робить множини значно швидшими за списки для перевірки наявності елемента та операцій додавання чи видалення, де списки мають складність O(n) (час зростає лінійно із розміром списку) у найгіршому випадку.
Коли використовувати:
- Потрібні унікальні елементи, що гарантує відсутність дублікатів у колекції;
- Необхідна швидка перевірка наявності елемента, що робить множини ідеальними для завдань на перевірку існування елемента;
- Виконуються операції, такі як об'єднання, перетин або різниця множин, які підтримуються оптимізованими методами;
- Порядок не має значення, оскільки множини не впорядковані й немає потреби зберігати порядок додавання.
1234567891011121314151617181920# Removing duplicates from a list using a set numbers = [1, 3, 2, 3, 5, 4, 5] unique_numbers = set(numbers) print(f'Unique Numbers: {unique_numbers}') # Fast membership testing names = {'Alice', 'Bob', 'Charlie'} print(f'Is Alice in the set? {"Alice" in names}') print(f'Is Eve in the set? {"Eve" in names}') # Set operations: union, intersection, and difference set_a = {1, 4, 3, 2} set_b = {3, 5, 4, 6} print(f'Union: {set_a.union(set_b)}') print(f'Intersection: {set_a.intersection(set_b)}') print(f'Difference: {set_a.difference(set_b)}') # Removing elements from a set safely with discard names.discard('Alice') # Safe removal, no error if the element doesn't exist print(f'Names after removal: {names}')
Тепер порівняймо продуктивність множини та списку при перевірці наявності елемента:
12345678910111213141516171819import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator # Create a large list and set with the same elements large_list = list(range(10000000)) large_set = set(large_list) # Test membership for an element at the end element_to_find = 9999999 @timeit_decorator(number=50) def test_membership(element, collection): return element in collection print('List:') print(test_membership(element_to_find, large_list)) print('Set:') print(test_membership(element_to_find, large_set))
Кортеж
Кортежі зазвичай використовуються, коли потрібно гарантувати незмінність даних або використовувати їх як ключ у dict чи елемент у set (оскільки кортежі є хешованими).
-
Краще за списки: коли потрібні незмінні дані, необхідно використовувати колекцію як ключ словника або елемент множини, або коли потрібне ефективне використання пам’яті для фіксованої кількості елементів;
-
Краще за NumPy-масиви: коли дані є нечисловими або коли важлива незмінність. NumPy-масиви призначені для числових обчислень і за замовчуванням змінні, тоді як кортежі забезпечують безпеку для нечислових даних або невеликих структурованих колекцій, які мають залишатися постійними.
12345678# Each tuple in the list represents an immutable student record students = [ (1834, 'James', 'Johnson'), (2749, 'Alice', 'Smith'), (4923, 'Bob', 'Brown') ] # Attempting to modify a tuple will raise a TypeError students[0][1] = 'Fred'
Оскільки список students містить записи студентів (ID, ім'я, прізвище), які мають бути тільки для читання, доцільніше використовувати кортежі для кожного запису замість списків. Крім того, як зазначено вище, кортежі трохи більш ефективні за використанням пам'яті порівняно зі списками.
1. Який із наступних сценаріїв найкраще підходить для використання множини замість списку?
2. У вас є набір даних із мільйонами записів, і потрібно часто перевіряти, чи існують у ньому певні значення. Яка структура даних є найбільш ефективною для цієї мети?
3. Ви створюєте запис для кожного студента, який містить унікальний ідентифікатор, ім'я та прізвище. Дані не повинні змінюватися після створення. Яка структура даних буде найбільш доречною?
Дякуємо за ваш відгук!