Тема: поведінка змінних при конвертації zip-об'єкта в list та dict

Доброго дня!

Завдання: створити два списки, поєднати їх за допомогою функції zip(), результат конвертувати в list та dict, вивести в консоль.

При виконанні завдання виникло питання:

spares = ['Samsung', 'Apple', 'Sony'] 
costs = [100, 75, 50]                       

prices_zip = zip(spares, costs)               

prices_list = list(prices_zip)                     
prices_dict = dict(prices_zip)

print(prices_list) # [('Samsung', 100), ('Apple', 75), ('Sony', 50)] - все коректно

print(prices_dict) # { } - пустий словник

Чому після конвертації prices_zip в тип list вона ніби позбавляється елементів і надалі її елементи вже неможливо "витягти" в dict?
Авжеж змінна prices_zip має лишатись, як була, бо для її конвертації  я створюю нову змінну.
Тим більше, для zip-обєктів .copy() не існує.

Навіть якщо я взагалі нічого не змінюю, а лише намагаюсь вивести в консоль:

print(list(prices_zip) #[('Samsung', 100), ('Apple', 75), ('Sony', 50)]

print(dict(prices_zip) # { }

Тож, взагалі неясно, як виконати завдання, коли треба конвертувати zip-об'єкт спочатку в один, а потім в інший формат, зберігаючи повноту даних (якщо, наприклад, я конвертую спочатку zip  в dict, а потім dict в list - то втрачу значення ключів словника).

При цьому, якщо я роблю:

prices_list = list(zip(spares, costs))
prices_dict = dict(zip(spares, costs))

все працює коректно.

Дякую за відповідь.

2

Re: поведінка змінних при конвертації zip-об'єкта в list та dict

zip повертає не список, а ітератор. Ітератор - це така абстракція поточного стану циклу. Хороший бік ітераторів - вони не копіюють собі дані, лише зберігають посилання на колекцію та поточну позицію, що дуже економно. Поганий бік ітераторів - їх можна використати лише один раз; ітератор, що закінчився, вже не "оживити".
Для копіювання ітераторів можна скористатися itertools.tee; але тоді не гарантується економність: якщо одна з копій просунеться вперед, tee зберігатиме всі значення, повернуті ітератором.
Правильний спосіб - створювати об'єкт zip кожного разу, як потрібно, це дешева операція.

Подякували: oleksandr_kharkiv, bebyk2

3

Re: поведінка змінних при конвертації zip-об'єкта в list та dict

koala написав:

zip повертає не список, а ітератор. Ітератор - це така абстракція поточного стану циклу. Хороший бік ітераторів - вони не копіюють собі дані, лише зберігають посилання на колекцію та поточну позицію, що дуже економно. Поганий бік ітераторів - їх можна використати лише один раз; ітератор, що закінчився, вже не "оживити".
Для копіювання ітераторів можна скористатися itertools.tee; але тоді не гарантується економність: якщо одна з копій просунеться вперед, tee зберігатиме всі значення, повернуті ітератором.
Правильний спосіб - створювати об'єкт zip кожного разу, як потрібно, це дешева операція.


Велике дякую за Вашу відповідь! Сам би, мабуть, декілька годин шукав.

4

Re: поведінка змінних при конвертації zip-об'єкта в list та dict

На відміну від спасибі, дякувати - це дієслово, і з прикметниками воно не узгоджується. Відповідно, "велике дякую" - це як "велике бігаю" чи "велике одягаю". Ну, хіба що ви вирішили, що я є чимось великим середнього роду, але й тоді правильно буде "дякую великому". Правильно вживати прислівники: "красно дякую", "щиро дякую", "дуже дякую".

5

Re: поведінка змінних при конвертації zip-об'єкта в list та dict

Щиро дякую!