-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path18_zip_enumerate_tutorial.py
More file actions
241 lines (176 loc) · 5.88 KB
/
18_zip_enumerate_tutorial.py
File metadata and controls
241 lines (176 loc) · 5.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# ========== ZIP ==========
# 1. Basic use of zip()
# zip() combines multiple iterable objects into pairs
names = ["Pavel", "Ivan", "Maria"]
ages = [25, 30, 28]
# Combine into pairs (name, age)
pairs = zip(names, ages)
print(f"zip object: {pairs}") # <zip object>
# Convert to list
pairs_list = list(zip(names, ages))
print(f"Pairs: {pairs_list}")
# 2. Iterating over zip
names = ["Pavel", "Ivan", "Maria"]
ages = [25, 30, 28]
for name, age in zip(names, ages):
print(f"{name} - {age} years old")
# 3. Three or more lists
names = ["Pavel", "Ivan", "Maria"]
ages = [25, 30, 28]
cities = ["Moscow", "SPb", "Kazan"]
for name, age, city in zip(names, ages, cities):
print(f"{name}, {age} years old, {city}")
# 4. Different length lists
# zip stops at the shortest list!
names = ["Pavel", "Ivan", "Maria", "Anna"] # 4 elements
ages = [25, 30] # 2 elements
pairs = list(zip(names, ages))
print(f"Short zip: {pairs}") # Only 2 pairs
# 5. zip_longest (itertools) - for lists of different lengths
from itertools import zip_longest
names = ["Pavel", "Ivan", "Maria", "Anna"]
ages = [25, 30]
# fillvalue - value for missing elements
pairs = list(zip_longest(names, ages, fillvalue=None))
print(f"zip_longest: {pairs}")
# 6. Creating dictionary from two lists
keys = ["name", "age", "city"]
values = ["Pavel", 25, "Moscow"]
person = dict(zip(keys, values))
print(f"Dictionary: {person}")
# 7. Unpacking (unzip)
pairs = [("Pavel", 25), ("Ivan", 30), ("Maria", 28)]
# * unpacks list of pairs
names, ages = zip(*pairs)
print(f"Names: {names}")
print(f"Ages: {ages}")
# Note! zip returns tuples, not lists
names_list = list(names)
ages_list = list(ages)
print(f"Names (list): {names_list}")
# 8. Transposing matrix
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
transposed = list(zip(*matrix))
print(f"Transposed: {transposed}")
# Convert tuples back to lists
transposed_lists = [list(row) for row in zip(*matrix)]
print(f"Transposed (lists): {transposed_lists}")
# 9. Parallel iteration with index
names = ["Pavel", "Ivan", "Maria"]
ages = [25, 30, 28]
for i, (name, age) in enumerate(zip(names, ages)):
print(f"{i}: {name} - {age} years old")
# 10. Combining nested lists
list1 = [1, 2, 3]
list2 = [10, 20, 30]
# Pairwise addition
sums = [a + b for a, b in zip(list1, list2)]
print(f"Sums: {sums}")
# With map
sums_map = list(map(lambda pair: pair[0] + pair[1], zip(list1, list2)))
print(f"Sums (map): {sums_map}")
# ========== ENUMERATE ==========
# 11. Basic use of enumerate()
# enumerate() adds a counter to an iterable object
fruits = ["apple", "banana", "orange"]
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
# 12. Starting counter from a different number
fruits = ["apple", "banana", "orange"]
# Start from 1 instead of 0
for index, fruit in enumerate(fruits, start=1):
print(f"{index}. {fruit}")
# 13. Converting enumerate to list
fruits = ["apple", "banana", "orange"]
indexed = list(enumerate(fruits))
print(f"Indexed list: {indexed}")
indexed_from_1 = list(enumerate(fruits, start=1))
print(f"Indexed from 1: {indexed_from_1}")
# 14. Creating dictionary with indices as keys
fruits = ["apple", "banana", "orange"]
fruit_dict = dict(enumerate(fruits))
print(f"Dictionary: {fruit_dict}")
# 15. Finding element index
fruits = ["apple", "banana", "orange", "banana"]
# Find all indices of "banana"
indices = [i for i, fruit in enumerate(fruits) if fruit == "banana"]
print(f"Indices of 'banana': {indices}")
# 16. Modifying list elements by index
numbers = [10, 20, 30, 40, 50]
# Double every second element
for i, num in enumerate(numbers):
if i % 2 == 0:
numbers[i] = num * 2
print(f"Modified list: {numbers}")
# 17. Enumerate with strings
text = "Python"
for index, char in enumerate(text):
print(f"Position {index}: {char}")
# 18. Enumerate with condition
fruits = ["apple", "banana", "orange", "pear"]
# Print only elements with even indices
for i, fruit in enumerate(fruits):
if i % 2 == 0:
print(f"{i}: {fruit}")
# ========== Combining ZIP and ENUMERATE ==========
# 19. zip + enumerate
names = ["Pavel", "Ivan", "Maria"]
ages = [25, 30, 28]
for i, (name, age) in enumerate(zip(names, ages), start=1):
print(f"{i}. {name} - {age} years old")
# 20. Practical example: comparing two lists
list1 = [1, 2, 3, 4, 5]
list2 = [1, 2, 9, 4, 7]
differences = []
for i, (a, b) in enumerate(zip(list1, list2)):
if a != b:
differences.append((i, a, b))
print(f"Differences (index, value1, value2): {differences}")
# 21. Practical example: numbered menu
menu_items = ["New Game", "Load", "Settings", "Exit"]
print("Menu:")
for i, item in enumerate(menu_items, start=1):
print(f"{i}. {item}")
# 22. Practical example: combining data
first_names = ["Ivan", "Maria", "Peter"]
last_names = ["Ivanov", "Petrova", "Sidorov"]
ages = [25, 30, 28]
people = []
for first, last, age in zip(first_names, last_names, ages):
people.append({
"first_name": first,
"last_name": last,
"age": age,
"full_name": f"{first} {last}"
})
print(f"People: {people}")
# 23. Iterating over pairs of adjacent elements
numbers = [1, 2, 3, 4, 5]
# Pairs (1,2), (2,3), (3,4), (4,5)
pairs = list(zip(numbers, numbers[1:]))
print(f"Adjacent pairs: {pairs}")
# Check for ascending order
is_increasing = all(a < b for a, b in zip(numbers, numbers[1:]))
print(f"List is increasing: {is_increasing}")
# ========== When to use ==========
# ZIP:
# ✅ Parallel iteration over multiple lists
# ✅ Creating dictionaries from keys and values
# ✅ Transposing data
# ✅ Pairwise operations
# ENUMERATE:
# ✅ When you need the index of an element in a loop
# ✅ Creating numbered lists
# ✅ Tracking position in iteration
# ✅ Avoid range(len(list)) - use enumerate!
# Anti-pattern (bad):
fruits = ["apple", "banana"]
for i in range(len(fruits)):
print(f"{i}: {fruits[i]}")
# Pythonic way (good):
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")