2010-02-17 33 views
8

Có tình huống nào khi việc sử dụng danh sách dẫn đến lỗi và bạn phải sử dụng một bộ dữ liệu thay thế?Một danh sách so với tình huống tuple trong Python

Tôi biết điều gì đó về các thuộc tính của cả bộ dữ liệu và danh sách, nhưng không đủ để tìm ra câu trả lời cho câu hỏi này. Nếu câu hỏi sẽ là cách khác xung quanh, nó sẽ là danh sách có thể được điều chỉnh nhưng tuples không.

+0

có thể trùng lặp của http://stackoverflow.com/questions/1983/python-what-is-the-difference-between-1-2-3-and-1-2-3-and-when-should- i-use – outis

Trả lời

14

Bạn có thể sử dụng bộ dữ liệu làm khóa từ điển, vì chúng không thay đổi, nhưng bạn không thể sử dụng danh sách. Ví dụ:

d = {(1, 2): 'a', (3, 8, 1): 'b'} # Valid. 
d = {[1, 2]: 'a', [3, 8, 1]: 'b'} # Error. 
+0

Cảm ơn câu trả lời của bạn! Bằng cách này, tôi biết đến Python nhiều hơn và nhiều hơn nữa .. – Alphonse

+0

Tương tự như vậy, các bộ có thể thay đổi được nhưng không phải là frozensets. Vì vậy, nếu bạn cần một bộ như là một chìa khóa, bạn phải chuyển đổi nó thành một frozenset. – FogleBird

9

Do tính chất không thay đổi, bộ dữ liệu (không giống như danh sách) là hashable. Đây là những gì cho phép tuples là chìa khóa trong từ điển và cũng là thành viên của bộ. Nói đúng ra nó là khả năng bẻ khóa của họ, chứ không phải tính bất biến của họ.

Vì vậy, ngoài việc chủ chốt từ điển câu trả lời đã được đưa ra, một vài thứ khác mà sẽ làm việc cho các bộ nhưng không liệt kê là:

>>> hash((1, 2)) 
3713081631934410656 

>>> set([(1, 2), (2, 3, 4), (1, 2)]) 
set([(1, 2), (2, 3, 4)]) 
3

Trong chuỗi định dạng tuples là bắt buộc:

"You have %s new %s" % ('5', 'mails') # must be a tuple, not a list! 

Sử dụng danh sách trong ví dụ đó tạo lỗi "không đủ đối số cho chuỗi định dạng", vì danh sách được coi là một đối số. Lạ lùng nhưng đúng.

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