Tại sao bạn phải gọi .items () khi lặp qua từ điển trong Python?


131

Tại sao bạn phải gọi items()để lặp lại các cặp khóa, giá trị trong từ điển? I E.

dic = {'one': '1', 'two': '2'}
for k, v in dic.items():
    print(k, v)

Tại sao đó không phải là hành vi mặc định của việc lặp lại từ điển

for k, v in dic:
    print(k, v)

Câu trả lời:


171

Đối với mỗi container python C, kỳ vọng là

for item in C:
    assert item in C

sẽ vượt qua tốt - sẽ không bạn tìm thấy nó đáng ngạc nhiên nếu một cảm giác in(mệnh đề loop) có một ý nghĩa hoàn toàn khác nhau từ khác (kiểm tra sự hiện diện)? Tôi chắc chắn sẽ! Nó tự nhiên hoạt động theo cách đó cho danh sách, bộ, bộ, ...

Vì vậy, khi Clà một từ điển, nếu inđể tạo ra các bộ khóa / giá trị trong một forvòng lặp, thì theo nguyên tắc ít ngạc nhiên nhất, incũng sẽ phải lấy một bộ dữ liệu như là toán hạng bên trái của nó trong kiểm tra ngăn chặn.

Điều đó hữu ích như thế nào? Khá vô dụng thực sự, về cơ bản làm cho if (key, value) in Cmột từ đồng nghĩa với if C.get(key) == value- đó là một tấm séc Tôi tin rằng tôi có thể thực hiện, hoặc muốn thực hiện, hiếm khi hơn 100 lần so với những gì if k in Cthực sự có nghĩa là , kiểm tra sự hiện diện của chìa khóa duy nhất và hoàn toàn bỏ qua các giá trị.

Mặt khác, muốn lặp chỉ trên các phím là khá phổ biến, ví dụ:

for k in thedict:
    thedict[k] += 1

có giá trị cũng không giúp được gì đặc biệt:

for k, v in thedict.items():
    thedict[k] = v + 1

thực sự có phần ít rõ ràng và ít súc tích hơn. (Lưu ý rằng itemslà cách viết ban đầu của phương pháp "hợp lý" để sử dụng để có được chìa khóa / cặp giá trị: không may đó là trở lại trong những ngày khi accessors như trở lại toàn bộ danh sách, như vậy để hỗ trợ "chỉ lặp lại" cách viết khác đã được giới thiệu và iteritems đó là - trong Python 3, trong đó các ràng buộc tương thích ngược với các phiên bản Python trước đó đã bị suy yếu rất nhiều, nó đã trở itemslại).


10

Tôi đoán: Sử dụng bộ dữ liệu đầy đủ sẽ trực quan hơn cho việc lặp, nhưng có lẽ ít hơn để kiểm tra tư cách thành viên in.

if key in counts:
    counts[key] += 1
else:
    counts[key] = 1

Mã đó sẽ không thực sự hoạt động nếu bạn phải chỉ định cả khóa và giá trị cho in. Tôi đang gặp khó khăn khi tưởng tượng trường hợp sử dụng trong đó bạn sẽ kiểm tra xem cả khóa VÀ giá trị có trong từ điển hay không. Nó là tự nhiên hơn nhiều để chỉ kiểm tra các phím.

# When would you ever write a condition like this?
if (key, value) in dict:

Bây giờ không cần thiết phải invận hành và for ... invận hành trên cùng một mặt hàng. Thực hiện khôn ngoan họ là các hoạt động khác nhau ( __contains__so với __iter__). Nhưng sự không nhất quán nhỏ đó sẽ hơi khó hiểu và, tốt, không nhất quán.


Cho rằng đối với mỗi loại khác của BUILTIN iterable mà tôi có thể nghĩ ra, x in foochỉ khi itrong for i in foogiả định giá trị của xtại một số điểm, tôi sẽ nói rằng nó sẽ là một rất lớn mâu thuẫn.
aaronasterling
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.