Cách tạo một bộ giá trị chỉ với một phần tử


107

Trong ví dụ dưới đây, tôi mong muốn tất cả các phần tử là các bộ giá trị, tại sao một bộ giá trị được chuyển đổi thành một chuỗi khi nó chỉ chứa một chuỗi duy nhất?

>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>

1
('a')chỉ đánh giá'a'
oldrinb 13/10/12

1
Wow - 3 đúng câu trả lời trong vòng 3 phút :) Tuy nhiên, lưu ý các bí mật của ,:a = 1, 2, 3; print a

26
Dấu ngoặc không tạo thành bộ, dấu phẩy thì có.
cdarke

17
@cdarke, ngoại trừ bộ giá trị trống (), chỉ chứa trong một cặp dấu ngoặc đơn.
Frédéric Hamidi 14/10/12

2
Đúng, hay đúng hơn, False- chỉ về tất cả một tuple trống là tốt cho (nếu bạn hiểu ý tôi).
cdarke 14/10/12

Câu trả lời:


140

Bởi vì hai phần tử đầu tiên không phải là bộ giá trị; chúng chỉ là chuỗi. Dấu ngoặc đơn không tự động tạo thành bộ giá trị. Bạn phải thêm dấu phẩy sau chuỗi để cho python biết rằng nó phải là một bộ.

>>> type( ('a') )
<type 'str'>

>>> type( ('a',) )
<type 'tuple'>

Để sửa mã mẫu của bạn, hãy thêm dấu phẩy vào đây:

>>> a = [('a',), ('b',), ('c', 'd')]

             ^       ^

Từ Tài liệu Python :

Một vấn đề đặc biệt là việc xây dựng các bộ giá trị có chứa 0 hoặc 1 mục: cú pháp có thêm một số điểm lạ để chứa chúng. Các bộ giá trị rỗng được xây dựng bởi một cặp dấu ngoặc đơn trống; một bộ với một mục được xây dựng bằng cách theo sau một giá trị có dấu phẩy (không đủ để đặt một giá trị trong ngoặc đơn). Xấu xí, nhưng hiệu quả.

Nếu bạn thực sự ghét cú pháp dấu phẩy ở cuối, thì giải pháp là chuyển một listvào tuple()hàm:

x = tuple(['a'])

6
Tuy nhiên, điều này không được thanh lịch cho lắm và trông hơi khó hiểu. Còn cách nào khác không?
Robert Moore

3
Điều đó dường như không hiệu quả. Ví dụ: tuple ("abc") (có hoặc không có thêm dấu phẩy) cho ('a', 'b', 'c'), while ("abc",) cho ('abc'). Vì vậy, tuple () có vẻ không phải là một lựa chọn khả thi ở đây.
Ben Farmer

3
@Ben Chúc các bạn xem qua tài liệu . tuple chấp nhận một có thể lặp lại , là một chuỗi (lặp qua các ký tự). Nếu bạn nhấn mạnh vào không sử dụng dấu phẩy dấu, sau đó đưa ra một danh sách trung gian: tuple(['abc']).
Jonathon Reinhart

Chắc chắn, tôi chỉ nói rằng hàm tuple không phủ nhận sự cần thiết của dấu phẩy.
Ben Farmer

1
@matanster Cú pháp ngôn ngữ không thay đổi về mặt này. AFAIK vấn đề cũng giống như đối với Python 2 và 3.
Jonathon Reinhart

20

Hai ví dụ đầu tiên của bạn không phải là bộ giá trị, chúng là chuỗi. Các bộ giá trị một mục yêu cầu một dấu phẩy ở cuối, như trong:

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]

11

('a') không phải là một bộ, mà chỉ là một chuỗi.

Bạn cần thêm một dấu phẩy ở cuối để pythoncoi chúng là tuple: -

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>> 
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.