Lặp lại từ điển bằng cách sử dụng các vòng lặp 'cho'
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
...
Làm thế nào để Python nhận ra rằng nó chỉ cần đọc khóa từ từ điển? Khóa có phải là một từ đặc biệt trong Python không? Hay nó chỉ đơn giản là một biến số?
Đó không chỉ là for
các vòng lặp. Từ quan trọng ở đây là "lặp đi lặp lại".
Từ điển là ánh xạ các khóa tới các giá trị:
d = {'x': 1, 'y': 2, 'z': 3}
Bất cứ khi nào chúng tôi lặp lại nó, chúng tôi lặp lại các phím. Tên biến key
chỉ nhằm mục đích mô tả - và nó khá thích hợp cho mục đích này.
Điều này xảy ra trong một sự hiểu biết danh sách:
>>> [k for k in d]
['x', 'y', 'z']
Nó xảy ra khi chúng ta chuyển từ điển vào danh sách (hoặc bất kỳ đối tượng loại bộ sưu tập nào khác):
>>> list(d)
['x', 'y', 'z']
Cách Python lặp đi lặp lại, trong ngữ cảnh mà nó cần, nó gọi __iter__
phương thức của đối tượng (trong trường hợp này là từ điển) trả về một iterator (trong trường hợp này là đối tượng keyiterator):
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>
Thay vào đó, chúng ta không nên sử dụng các phương thức đặc biệt này, sử dụng hàm dựng sẵn tương ứng để gọi nó , iter
:
>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>
Các trình vòng lặp có một __next__
phương thức - nhưng chúng ta gọi nó với hàm dựng sẵn , next
:
>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Khi một vòng lặp bị cạn kiệt, nó sẽ tăng lên StopIteration
. Đây là cách Python biết để thoát khỏi một for
vòng lặp, hoặc hiểu danh sách hoặc biểu thức trình tạo hoặc bất kỳ bối cảnh lặp nào khác. Khi một trình vòng lặp tăng lên, StopIteration
nó sẽ luôn nâng nó lên - nếu bạn muốn lặp lại lần nữa, bạn cần một cái mới.
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']
Quay trở lại
Chúng tôi đã nhìn thấy các dicts lặp đi lặp lại trong nhiều bối cảnh. Những gì chúng ta đã thấy là bất cứ khi nào chúng ta lặp đi lặp lại một lệnh, chúng ta sẽ nhận được các phím. Quay lại ví dụ ban đầu:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
Nếu chúng ta thay đổi tên biến, chúng ta vẫn nhận được các khóa. Hãy thử nó:
>>> for each_key in d:
... print(each_key, '=>', d[each_key])
...
x => 1
y => 2
z => 3
Nếu chúng ta muốn lặp lại các giá trị, chúng ta cần sử dụng .values
phương thức dicts hoặc cho cả hai cùng nhau .items
:
>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]
Trong ví dụ đã cho, việc lặp lại các mục như thế này sẽ hiệu quả hơn:
for a_key, corresponding_value in d.items():
print(a_key, corresponding_value)
Nhưng đối với mục đích học tập, ví dụ của câu hỏi là tốt.