Python ตั้งเป็นรายการ


159

ฉันจะแปลงชุดเป็นรายการใน Python ได้อย่างไร การใช้

a = set(["Blah", "Hello"])
a = list(a)

ไม่ทำงาน มันทำให้ฉัน:

TypeError: 'set' object is not callable
python  list  set 

6
การทำงานข้างต้นสำหรับฉันใน Python 2.7
aukaost

20
หากคุณตั้งชื่อตัวแปรอื่นในรหัสของคุณให้setเปลี่ยนเพราะคุณทำแชโดว์กับฟังก์ชั่นบิวsetอิน
mouad

5
@mouad ไม่มีสตริงในวงเล็บในส่วนTypeErrorที่เป็นชื่อของประเภทไม่ชื่อตัวแปร
phihag

7
@Judge John Deed: คุณทำlist = some_setที่ไหนสักแห่ง เพิ่มprint listก่อนที่คุณจะเรียกมันว่า
Jochen Ritzel

6
ฉันพบปัญหานี้ขณะทำการดีบักใน PDB โดยที่ 'list' ถูกเขียนทับเป็นคำสั่ง PDB
WP McNeill

คำตอบ:


242

รหัสของคุณใช้งานได้ (ทดสอบกับ cpython 2.4, 2.5, 2.6, 2.7, 3.1 และ 3.2):

>>> a = set(["Blah", "Hello"])
>>> a = list(a) # You probably wrote a = list(a()) here or list = set() above
>>> a
['Blah', 'Hello']

ตรวจสอบว่าคุณไม่ได้เขียนทับlistโดยบังเอิญ:

>>> assert list == __builtins__.list

2
ฉันเพิ่งคัดลอกและวางรหัสที่แน่นอนนี้ใน IDLE; ฉันได้รับข้อผิดพลาด

คุณสามารถให้ผลลัพธ์ของdir(set)และprint set?
Susam Pal

['and', 'class', 'cmp', 'contains', 'delattr', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'iand', 'init', 'ior', 'isub', 'iter', 'ixor', 'le', 'len', 'lt', 'ne', 'new', 'or', 'rand', 'reduce', 'reduce_ex', 'repr', 'ror', 'rsub', 'rxor', 'setattr', 'sizeof', 'str', 'sub', 'subclasshook', 'xor', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update'](ลบออก __ เนื่องจากข้อ จำกัด ถ่าน)

@Judge John Deed คุณพบข้อผิดพลาดที่บรรทัดใด คุณsetดูดี
Phihag

ลองตั้งแทนการตั้งค่า: REF: docs.python.org/2/library/sets.html
Gonzalo

72

คุณได้สร้างเงาภายในชุดโดยบังเอิญโดยใช้มันเป็นชื่อตัวแปรต่อไปนี้เป็นวิธีง่ายๆในการทำซ้ำข้อผิดพลาดของคุณ

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

บรรทัดแรกจะรีบูทชุดให้เป็นอินสแตนซ์ของชุด บรรทัดที่สองพยายามเรียกอินสแตนซ์ซึ่งแน่นอนว่าล้มเหลว

นี่คือเวอร์ชันที่สับสนน้อยกว่าโดยใช้ชื่อที่แตกต่างกันสำหรับแต่ละตัวแปร ใช้ล่ามสด

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

หวังว่าจะเห็นได้ชัดว่าการโทรaเป็นข้อผิดพลาด



15

สิ่งนี้จะได้ผล:

>>> t = [1,1,2,2,3,3,4,5]
>>> print list(set(t))
[1,2,3,4,5]

อย่างไรก็ตามหากคุณใช้ "list" หรือ "set" เป็นชื่อตัวแปรคุณจะได้รับ:

TypeError: 'set' object is not callable

เช่น:

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

ข้อผิดพลาดเดียวกันจะเกิดขึ้นหากคุณใช้ "รายการ" เป็นชื่อตัวแปร




2

ลองใช้ฟังก์ชั่นแผนที่และแลมบ์ดาร่วมกัน:

aList = map( lambda x: x, set ([1, 2, 6, 9, 0]) )

มันเป็นวิธีที่สะดวกมากหากคุณมีชุดตัวเลขในสตริงและคุณต้องการแปลงเป็นรายการจำนวนเต็ม:

aList = map( lambda x: int(x), set (['1', '2', '3', '7', '12']) )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.