แปลงรายการเป็น tuple ใน Python


544

ฉันพยายามแปลงรายการเป็น tuple

โซลูชันส่วนใหญ่ใน Google เสนอรหัสต่อไปนี้:

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

อย่างไรก็ตามรหัสส่งผลให้เกิดข้อผิดพลาดเมื่อฉันเรียกใช้:

TypeError: วัตถุ 'tuple' ไม่สามารถเรียกได้ฉันจะแก้ไขปัญหานี้ได้อย่างไร


78
คุณเคยกำหนดชื่อตัวแปรtupleที่อื่นมาก่อนหรือไม่?
eumiro

18
เพื่อไม่ให้จู้จี้มากเกินไป แต่คุณอาจไม่ควรใช้ตัวพิมพ์เล็ก "el" เป็นชื่อตัวแปรเนื่องจากมีความคล้ายคลึงกับ 1 เหมือนกันกับทุน "oh" เนื่องจากมีความคล้ายคลึงกับศูนย์ แม้กระทั่ง "li" ก็ยังอ่านได้มากขึ้นเมื่อเปรียบเทียบ
Albert Rothman

คำตอบ:


815

มันควรจะทำงานได้ดี อย่าใช้tuple, listหรือชื่อพิเศษอื่น ๆ เป็นชื่อตัวแปร อาจเป็นสิ่งที่ทำให้เกิดปัญหาของคุณ

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

109

การขยายความคิดเห็นของ eumiro โดยปกติแล้วtuple(l)จะแปลงรายการlเป็น tuple:

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

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

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

อย่างไรก็ตามหากคุณนิยามใหม่tupleให้เป็น tuple มากกว่าtype tuple:

In [4]: tuple = tuple(l)

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

จากนั้นคุณจะได้รับ TypeError เนื่องจาก tuple นั้นไม่สามารถเรียกได้:

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

คุณสามารถกู้คืนคำจำกัดความเดิมสำหรับtupleโดยการออกและรีสตาร์ทล่ามของคุณหรือ (ขอบคุณ @glglgl):

In [6]: del tuple

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

29

คุณอาจทำสิ่งนี้:

>>> 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)

นี่คือปัญหา ... เนื่องจากคุณใช้tupleตัวแปรเพื่อเก็บไว้tuple (45, 34)ก่อนหน้านี้ ... ดังนั้นตอนนี้tupleเป็นobjectประเภทtupleตอนนี้ ...

มันไม่มีอีกtypeแล้วดังนั้นมันไม่มีอีกCallableแล้ว

Neverใช้ชนิดบิวด์อินเป็นชื่อตัวแปรของคุณ ... คุณมีชื่ออื่นที่จะใช้ ใช้ชื่อใดก็ได้สำหรับตัวแปรของคุณแทน ...


25

ในการเพิ่มทางเลือกอื่นในtuple(l)ฐานะของ Python> = 3.5คุณสามารถทำได้:

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

สั้นเร็วขึ้นเล็กน้อยแต่อาจทนทุกข์ทรมานจากความสามารถในการอ่าน

นี้เป็นหลัก unpacks รายการlภายในตัวอักษร tuple ,ซึ่งถูกสร้างขึ้นเพราะการปรากฏตัวของจุลภาคเดียว


PS: ข้อผิดพลาดที่คุณได้รับเป็นเพราะกำบังของชื่อtupleเช่นคุณได้รับมอบหมายให้ชื่อ tuple tuple = (1, 2, 3)ที่ไหนสักแห่งเช่น

ใช้del tupleคุณควรจะดีไป


4

ฉันพบคำตอบล่าสุดและคำตอบที่ถูกต้อง แต่จะเพิ่มสิ่งใหม่ ๆ ลงในคำตอบจำนวนมาก

ในไพ ธ อนนั้นมีวิธีที่ไม่สิ้นสุดในการทำเช่นนี้ต่อไปนี้เป็นตัวอย่าง
วิธีปกติ

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

วิธีที่ชาญฉลาด

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

จำไว้ว่า tuple นั้นไม่เปลี่ยนรูปใช้สำหรับเก็บสิ่งที่มีค่า ตัวอย่างเช่นรหัสผ่านคีย์หรือแฮชจะถูกเก็บไว้ใน tuples หรือพจนานุกรม หากจำเป็นต้องใช้มีดทำไมต้องใช้ดาบเพื่อตัดแอปเปิ้ล ใช้อย่างชาญฉลาดมันจะทำให้โปรแกรมของคุณมีประสิทธิภาพ


2
ข้อดีของวิธีที่สองคืออะไร
ยาย

@GrannyAching ในนิยามของโลกสมัยใหม่ของ smart ที่เปลี่ยนแปลงอยู่ตลอดเวลาเนื่องจากมันเป็นวิธีที่ขี้เกียจทำในบรรทัดเดียวฉันคิดว่ามันเป็นวิธีที่ชาญฉลาด
TheExorcist

1
tuple(l)(วิธีแรก) สั้นกว่าtuple(item for item in l)(วิธีที่สอง)
ยาย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.