Làm thế nào để chuyển đổi một tập hợp thành một danh sách trong python?


143

Tôi đang cố gắng chuyển đổi một tập hợp thành một danh sách trong Python 2.6. Tôi đang sử dụng cú pháp này:

first_list = [1,2,3,4]
my_set=set(first_list)
my_list = list(my_set)

Tuy nhiên, tôi nhận được dấu vết ngăn xếp sau:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: 'set' object is not callable

Làm thế nào tôi có thể sửa lỗi này?


2
Hoạt động với tôi trên Python 2.6.6 trên Linux ... nhưng dòng đầu tiên đó không tạo ra một bộ.
gièm pha

2
Theo TypeError: 'set' object is not callable: là setgì? Cảm ơn
ăn

13
Bạn đã che giấu bộ dựng sẵn. Có lẽ bạn vô tình gõ set=set(first_list)hoặc một cái gì đó. Bây giờ setđược xác định lại cho đối tượng thiết lập này sẽ gây ra lỗi đó. Hãy thử lại với trình thông dịch Python mới
John La Rooy

3
@gnibbler: bạn nên đặt nó như một câu trả lời, vì đó rõ ràng là cái gì đã phá vỡ nó.
Chris Morgan

2
Thật tệ khi câu hỏi đã được chỉnh sửa để khắc phục vấn đề. Thật khó hiểu khi thấy mã chính xác theo sau là một lỗi mà nó sẽ không tạo ra. Trong thực tế, câu hỏi ban đầu trước khi chỉnh sửa cũng không gây ra lỗi hiển thị. Tôi nghi ngờ đây là một bản sao và dán lỗi.
LS

Câu trả lời:


194

Nó đã là một danh sách

type(my_set)
>>> <type 'list'>

Bạn có muốn một cái gì đó như

my_set = set([1,2,3,4])
my_list = list(my_set)
print my_list
>> [1, 2, 3, 4]

EDIT: Đầu ra của bình luận cuối cùng của bạn

>>> my_list = [1,2,3,4]
>>> my_set = set(my_list)
>>> my_new_list = list(my_set)
>>> print my_new_list
[1, 2, 3, 4]

Tôi tự hỏi nếu bạn đã làm một cái gì đó như thế này:

>>> set=set()
>>> set([1,2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'set' object is not callable

4
Khi tôi gõ (my_set), tôi nhận được <type 'set'>
gath

2
@gath, đó là trước khi bạn chỉnh sửa mã. Mã hiện tại của bạn hoạt động tốt trên máy của tôi. Bạn có thể thử sao chép nó vào một trình thông dịch python không và dán đầu ra ở đây
người dùng

1
hãy thử điều này: >>> my_list = [1,2,3,4] >>> my_set = set (my_list) >>> my_new_list = list (my_set) TracBack (cuộc gọi gần đây nhất cuối cùng): Tệp "<console>", dòng 1, trong <module> TypeError: đối tượng 'set' không thể gọi được
gath

1
Tôi cá là anh ta đã vô tình ràng buộc tên 'set' thành {1,2,3} hoặc [1,2,3] hoặc đại loại như thế. (Bởi vì tôi đã vô tình trong khi thử nghiệm)
user3556757

1
Chuyển đổi danh sách số nguyên bằng phương pháp này không đáng tin cậy: nếu bộ của bạn là ([1,2,12,6])list(([1,2,12,6]))bạn sẽ nhận được một danh sách như [1,2,1,2,6]
PradyJord

12

Thay vì:

first_list = [1,2,3,4]
my_set=set(first_list)
my_list = list(my_set)

Tại sao không tắt quá trình:

my_list = list(set([1,2,3,4])

Điều này sẽ loại bỏ các bản sao khỏi danh sách của bạn và trả lại một danh sách cho bạn.


5
Không có sự khác biệt giữa cả hai. Bạn chỉ cần nội tuyến các bài tập biến.

7

[EDITED] Có vẻ như trước đó bạn đã xác định lại "danh sách", sử dụng nó làm tên biến, như thế này:

list = set([1,2,3,4]) # oops
#...
first_list = [1,2,3,4]
my_set=set(first_list)
my_list = list(my_set)

Và bạn sẽ nhận được

Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: 'set' object is not callable

5

Bất cứ khi nào bạn bị mắc kẹt trong loại vấn đề như vậy, hãy thử tìm kiểu dữ liệu của phần tử bạn muốn chuyển đổi trước bằng cách sử dụng:

type(my_set)

Sau đó sử dụng:

  list(my_set) 

để chuyển đổi nó thành một danh sách. Bây giờ bạn có thể sử dụng danh sách mới được xây dựng như bất kỳ danh sách bình thường nào trong python.


3

Đơn giản chỉ cần gõ:

list(my_set)

Điều này sẽ biến một tập hợp ở dạng {'1', '2'} thành một danh sách ở dạng ['1', '2'].


2

Xem lại dòng đầu tiên của bạn. Theo dõi ngăn xếp của bạn rõ ràng không phải từ mã bạn đã dán ở đây, vì vậy tôi không biết chính xác những gì bạn đã làm.

>>> my_set=([1,2,3,4])
>>> my_set
[1, 2, 3, 4]
>>> type(my_set)
<type 'list'>
>>> list(my_set)
[1, 2, 3, 4]
>>> type(_)
<type 'list'>

Những gì bạn muốn là set([1, 2, 3, 4]).

>>> my_set = set([1, 2, 3, 4])
>>> my_set
set([1, 2, 3, 4])
>>> type(my_set)
<type 'set'>
>>> list(my_set)
[1, 2, 3, 4]
>>> type(_)
<type 'list'>

Ngoại lệ "không thể gọi được" có nghĩa là bạn đang làm một cái gì đó như set()()- cố gắng gọi một setthể hiện.


0

Tôi không chắc chắn rằng bạn đang tạo một bộ với ([1, 2])cú pháp này , thay vì một danh sách. Để tạo một bộ, bạn nên sử dụngset([1, 2]) .

Các dấu ngoặc này chỉ bao trùm biểu thức của bạn, như thể bạn đã viết:

if (condition1
    and condition2 == 3):
    print something

Không thực sự bỏ qua, nhưng không làm gì cho biểu hiện của bạn.

Lưu ý: (something, something_else)sẽ tạo một tuple (nhưng vẫn không có danh sách).


@gath chỉnh sửa của bạn có vẻ tốt với tôi, ít nhất là khối đầu tiên. Bạn vẫn có lỗi? Bạn có thể thử điều này trong một dòng lệnh mới không? Bạn nhận được gì khi gõ chỉ set?
Joël

0

Python là một ngôn ngữ được gõ động, có nghĩa là bạn không thể xác định loại biến như bạn làm trong C hoặc C ++:

type variable = value

hoặc là

type variable(value)

Trong Python, bạn sử dụng tính năng ép buộc nếu bạn thay đổi các loại hoặc các hàm init (hàm tạo) của các loại để khai báo một biến của một loại:

my_set = set([1,2,3])
type my_set

sẽ cho bạn <type 'set'> một câu trả lời.

Nếu bạn có một danh sách, hãy làm điều này:

my_list = [1,2,3]
my_set = set(my_list)

-1

Hmmm tôi cá rằng trong một số dòng trước bạn có một cái gì đó như:

list = set(something)

Liệu tôi có sai ?


Như đã đề cập ở trên trong một câu trả lời, bạn cũng có giả định tương tự. Trong mã chính của câu hỏi có lẽ được đặt listbằng với việc tạo tập hợp set(values). Và nó đã làm cho bối rối. Câu trả lời của bạn không nên được đánh giá thấp. Nhưng nó cũng không lôi kéo độc giả :) Chúng tôi chỉ lướt qua và thấy điều sai trái downvote.
Vladimir Vukanac
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.