Chuyển đổi danh sách sang tuple trong Python


544

Tôi đang cố gắng chuyển đổi một danh sách thành một tuple.

Hầu hết các giải pháp trên Google cung cấp mã sau:

l = [4,5,6]
tuple(l)

Tuy nhiên, mã dẫn đến một thông báo lỗi khi tôi chạy nó:

LoạiError: đối tượng 'tuple' không thể gọi được Làm thế nào tôi có thể khắc phục vấn đề này?


78
Bạn đã chỉ định tên biến tupleở nơi khác trước?
eumiro

18
Không quá cầu kỳ, nhưng có lẽ bạn cũng không nên sử dụng chữ thường "el" làm tên biến do nó giống với 1. Tương tự với chữ "oh" do nó giống với số không. Ngay cả "li" cũng dễ đọc hơn nhiều so với.
Albert Rothman

Câu trả lời:


815

Nó sẽ hoạt động tốt. Không sử dụng tuple, listhoặc tên đặc biệt khác như một tên biến. Có lẽ đó là những gì gây ra vấn đề của bạn.

>>> l = [4,5,6]
>>> tuple(l)
(4, 5, 6)

109

Mở rộng về nhận xét của eumiro, thông thường tuple(l)sẽ chuyển đổi một danh sách lthành một tuple:

In [1]: l = [4,5,6]

In [2]: tuple
Out[2]: <type 'tuple'>

In [3]: tuple(l)
Out[3]: (4, 5, 6)

Tuy nhiên, nếu bạn đã xác định lại tuplelà một tuple chứ không phải là type tuple:

In [4]: tuple = tuple(l)

In [5]: tuple
Out[5]: (4, 5, 6)

sau đó bạn nhận được TypeError vì bộ tuple không thể gọi được:

In [6]: tuple(l)
TypeError: 'tuple' object is not callable

Bạn có thể khôi phục định nghĩa ban đầu cho tuplebằng cách thoát và khởi động lại trình thông dịch của bạn hoặc (nhờ @glglgl):

In [6]: del tuple

In [7]: tuple
Out[7]: <type 'tuple'>

29

Bạn có thể đã làm một cái gì đó như thế này:

>>> tuple = 45, 34  # You used `tuple` as a variable here
>>> tuple
(45, 34)
>>> l = [4, 5, 6]
>>> tuple(l)   # Will try to invoke the variable `tuple` rather than tuple type.

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    tuple(l)
TypeError: 'tuple' object is not callable
>>>
>>> del tuple  # You can delete the object tuple created earlier to make it work
>>> tuple(l)
(4, 5, 6)

Đây là vấn đề ... Vì bạn đã sử dụng một tuplebiến để giữ tuple (45, 34)trước đó ... Vì vậy, bây giờ tuplelà một objectloại tuplebây giờ ...

Nó không còn là a typevà do đó, nó không còn nữa Callable.

Neversử dụng bất kỳ loại tích hợp nào làm tên biến của bạn ... Bạn có bất kỳ tên nào khác để sử dụng. Sử dụng bất kỳ tên tùy ý cho biến của bạn thay vì ...


25

Để thêm một thay thế khác tuple(l), kể từ Python> = 3.5bạn có thể làm:

t = *l,  # or t = (*l,) 

ngắn, nhanh hơn một chút nhưng có lẽ phải chịu sự dễ đọc.

Điều này về cơ bản giải nén danh sách lbên trong một tuple nghĩa đen được tạo ra do sự hiện diện của dấu phẩy duy nhất ,.


Ps: Lỗi bạn đang nhận là do che giấu tên tupletức là bạn đã gán cho tên tuple ở đâu đó, vd tuple = (1, 2, 3).

Sử dụng del tuplebạn nên được tốt để đi.


4

Tôi tìm thấy nhiều câu trả lời cập nhật và trả lời đúng nhưng sẽ thêm một cái gì đó mới vào chồng câu trả lời.

Trong python có vô số cách để làm điều này, đây là một số trường hợp
Cách thông thường

>>> l= [1,2,"stackoverflow","python"]
>>> l
[1, 2, 'stackoverflow', 'python']
>>> tup = tuple(l)
>>> type(tup)
<type 'tuple'>
>>> tup
(1, 2, 'stackoverflow', 'python')

cách thông minh

>>>tuple(item for item in l)
(1, 2, 'stackoverflow', 'python')

Hãy nhớ tuple là bất biến, được sử dụng để lưu trữ một cái gì đó có giá trị. Ví dụ: mật khẩu, khóa hoặc băm được lưu trữ trong bộ dữ liệu hoặc từ điển. Nếu cần dao tại sao phải dùng kiếm để cắt táo. Sử dụng nó một cách khôn ngoan, nó cũng sẽ làm cho chương trình của bạn hiệu quả.


2
Lợi thế của cách thứ hai là gì?
Bà ngoại đạt được

@GrannyAking trong định nghĩa thế giới hiện đại về thông minh này luôn thay đổi, vì đó là cách tiếp cận lười biếng được thực hiện trong một dòng, tôi đoán đó là cách thông minh.
TheExorcist

1
tuple(l)(cách thứ nhất) ngắn hơn tuple(item for item in l)(cách thứ hai).
Granny Đạt
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.