2009-06-18 24 views
6

thể trùng lặp:
Python dictionary: are keys() and values() always the same order?Các phím và giá trị trả lại Dict có cùng thứ tự không?

Nếu tôi có một dictonary trong python, .keys và .values ​​sẽ trở lại các yếu tố tương ứng theo thứ tự giống nhau không?

Ví dụ:

foo = {'foobar' : 1, 'foobar2' : 4, 'kittty' : 34743} 

Đối với các phím nó sẽ trả về:

>>> foo.keys() 
['foobar2', 'foobar', 'kittty'] 

Bây giờ sẽ foo.values ​​() trả về các yếu tố luôn luôn theo thứ tự giống như các phím tương ứng của họ?

Trả lời

17

Thật khó để cải thiện trên Python documentation:

Keys và các giá trị được liệt kê trong một trật tự tùy ý đó là không ngẫu nhiên, thay đổi qua việc triển khai Python, và phụ thuộc vào lịch sử của từ điển của chèn và xóa bỏ. Nếu items(), keys(), values(), iteritems(), iterkeys()itervalues() được gọi là không có sửa đổi can thiệp vào từ điển, danh sách sẽ tương ứng trực tiếp. Điều này cho phép tạo các cặp (value, key) sử dụng zip(): pairs = zip(d.values(), d.keys()). Mối quan hệ tương tự được giữ cho các phương pháp iterkeys()itervalues(): pairs = zip(d.itervalues(), d.iterkeys()) cung cấp cùng một giá trị cho các cặp. Một cách khác để tạo ra cùng một danh sách là pairs = [(v, k) for (k, v) in d.iteritems()]

Vì vậy, trong ngắn hạn, "yes" với sự báo trước rằng bạn không phải thay đổi từ điển trong giữa cuộc gọi của bạn để keys() và cuộc gọi của bạn để values().

+0

Hoàn hảo như một thằng ngốc. Tôi hoàn toàn bỏ lỡ điểm chính đó. :( – UberJumper

1

Vâng, họ sẽ

Chỉ cần nhìn thấy doc tại Python doc:

Keys và các giá trị được liệt kê trong một trật tự tùy ý đó là không ngẫu nhiên, thay đổi qua việc triển khai Python, và phụ thuộc vào từ điển của lịch sử chèn và xóa. Nếu các mục(), khóa(), giá trị(), iteritems(), iterkeys() và itervalues ​​() được gọi là không có sửa đổi can thiệp vào từ điển, danh sách sẽ tương ứng trực tiếp.

điều tốt nhất để làm vẫn là sử dụng dict.items()

1

Từ các tài liệu Python 2.6:

Keys và các giá trị được liệt kê trong một trật tự tùy ý đó là không ngẫu nhiên, thay đổi qua việc triển khai Python và phụ thuộc vào lịch sử chèn và xóa từ điển của từ điển. Nếu items(), keys(), values(), iteritems(), iterkeys()itervalues() được gọi là không có sửa đổi can thiệp vào từ điển, danh sách sẽ tương ứng trực tiếp. Điều này cho phép tạo cặp (giá trị, khóa) bằng cách sử dụng zip(): pairs = zip(d.values(), d.keys()).Mối quan hệ tương tự giữ cho các phương pháp iterkeys()itervalues(): pairs = zip(d.itervalues(), d.iterkeys()) cung cấp cùng một giá trị cho các cặp. Một cách khác để tạo cùng một danh sách là pairs = [(v, k) for (k, v) in d.iteritems()].

Tôi chắc chắn hơn 99% số tiền tương tự sẽ đúng với Python 3.0.

+0

Không cần suy đoán về Python 3.0. Tài liệu có tại đây: http://docs.python.org/3.0/library/stdtypes.html#dictionary-view-objects và khẳng định. –

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