2010-09-19 37 views
128

Tại sao bạn phải gọi iteritems() để lặp qua các cặp khóa, giá trị trong từ điển? tức làTại sao bạn phải gọi .iteritems() khi lặp qua một từ điển trong python?

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

Tại sao không phải là hành vi mặc định của iterating trên một cuốn từ điển

for k, v in dic: 
    print k, v 
+39

+1 Câu hỏi hay. Hãy xem những gì Alex đã nói – NullUserException

Trả lời

168

Đối với mỗi trăn chứa C, kỳ vọng là

for item in C: 
    assert item in C 

sẽ vượt qua tốt - sẽ không bạn thấy nó đáng ngạc nhiên nếu một cảm giác in (mệnh đề loop) đã có một hoàn toàn khác nhau ý nghĩa từ người 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 C là một từ điển, nếu in mang lại giá trị khóa/giá trị trong vòng lặp for, thì theo nguyên tắc ít ngạc nhiên nhất, in cũng sẽ phải lấy một tuple như toán hạng bên trái của nó trong kiểm tra ngăn chặn.

Sẽ hữu ích như thế nào? Khá vô dụng thực sự, về cơ bản làm if (key, value) in C mộ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 C thực nghĩa, kiểm tra sự hiện diện của chính chỉ và bỏ qua hoàn toàn giá trị.

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

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

có giá trị cũng sẽ không giúp đỡ đặc biệt:

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

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

+2

Giải thích rất rõ ràng. Tôi đoán tôi cần phải nhìn 'dưới mui xe' của python nhiều hơn một chút. Làm thế nào các toán tử 'in' và' cho x in' hoạt động vẫn là một chút phép thuật đối với tôi. – Falmarri

+0

@Falmarri, tôi sẽ vui mừng giải thích ở mức khái niệm (không cần phải đào sâu vào nguồn C ;-) nếu bạn hỏi một câu hỏi khác về điều đó!)) –

+0

Tôi là lập trình viên C++, vì vậy có thể đào sâu vào C có thể hữu ích hơn =] Làm thế nào các toán tử trong công việc python chỉ là một chút không trực quan đối với tôi (ít nhất là từ một hiểu biết mức thấp). – Falmarri

9

tôi đoán: Sử dụng đầy đủ các tuple sẽ trực quan hơn cho vòng lặp, nhưng có lẽ ít hơn để thử nghiệm cho thành viên sử dụng 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 nơi bạn muốn 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 nhà điều hành infor ... in hoạt động trên cùng một mục. 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ự mâu thuẫn nhỏ bé đó sẽ hơi khó hiểu và, tốt, không nhất quán.

+0

Cho rằng đối với _every_ loại lặp lại có thể lặp lại khác mà tôi có thể nghĩ đến, 'x trong foo' chỉ khi' i' trong 'cho i trong foo' giả định giá trị của' x' tại một số điểm , Tôi sẽ nói rằng nó sẽ là một sự không nhất quán __huge__. – aaronasterling

Các vấn đề liên quan