วิธีสร้างทูเพิลด้วยองค์ประกอบเดียว


108

ในตัวอย่างด้านล่างฉันคาดว่าองค์ประกอบทั้งหมดจะเป็นทูเปิลทำไมทูเปิลจึงถูกแปลงเป็นสตริงในเมื่อมีเพียงสตริงเดียว

>>> 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')เพิ่งประเมินถึง'a'
oldrinb

2
ว้าว - 3 คำตอบที่ถูกต้องใน 3 นาที :) อย่างไรก็ตามโปรดทราบความลับของ,:a = 1, 2, 3; print a

27
วงเล็บไม่สร้างทูเพิลให้ทำเครื่องหมายจุลภาค
cdarke

17
@cdarke ยกเว้นทูเพิลว่าง()ซึ่งประกอบด้วยคู่ของวงเล็บเท่านั้น
Frédéric Hamidi

2
จริงหรือมากกว่าFalse- ทูเปิลที่ว่างเปล่าทั้งหมดนั้นดีสำหรับ (ถ้าคุณเห็นว่าฉันหมายถึงอะไร)
cdarke

คำตอบ:


145

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

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

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

หากต้องการแก้ไขโค้ดตัวอย่างของคุณให้เพิ่มเครื่องหมายจุลภาคที่นี่:

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

             ^       ^

จากPython Docs :

ปัญหาพิเศษคือการสร้างสิ่งทอที่มี 0 หรือ 1 รายการ: ไวยากรณ์มีลักษณะพิเศษบางอย่างเพื่อรองรับสิ่งเหล่านี้ tuples ว่างถูกสร้างโดยวงเล็บคู่ว่าง ทูเปิลที่มีหนึ่งไอเท็มถูกสร้างขึ้นโดยทำตามค่าด้วยเครื่องหมายจุลภาค (ไม่เพียงพอที่จะใส่ค่าเดียวในวงเล็บ) น่าเกลียด แต่มีประสิทธิภาพ

หากคุณเกลียดไวยากรณ์ลูกน้ำต่อท้ายวิธีแก้ปัญหาคือส่ง a listไปยังtuple()ฟังก์ชัน:

x = tuple(['a'])

7
แม้ว่ามันจะไม่สวยหรูและดูสับสน มีวิธีอื่น ๆ ?
Robert Moore

3
ดูเหมือนจะไม่ได้ผล ตัวอย่างเช่น tuple ("abc") (มีหรือไม่มีลูกน้ำเสริม) จะให้ ('a', 'b', 'c') ในขณะที่ ("abc",) ให้ ('abc') ดังนั้น tuple () ดูเหมือนจะไม่ใช่ตัวเลือกที่ใช้ได้ที่นี่
Ben Farmer

3
@ Ben มีลักษณะที่เป็น เอกสาร tuple ยอมรับการทำซ้ำซึ่งสตริงคือ (วนซ้ำบนอักขระ) tuple(['abc'])หากคุณยืนยันในไม่ได้ใช้เครื่องหมายจุลภาคต่อท้ายแล้วให้รายชื่อกลาง:
Jonathon Reinhart

แน่นอนว่าฉันแค่บอกว่าฟังก์ชันทูเพิลไม่ได้ลบล้างความจำเป็นในการใช้ลูกน้ำ
Ben Farmer

1
@matanster ไวยากรณ์ของภาษาไม่ได้เปลี่ยนแปลงในเรื่องนี้ AFAIK ปัญหาเหมือนกันสำหรับ Python 2 และ 3
Jonathon Reinhart

20

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

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

11

('a') ไม่ใช่ทูเพิล แต่เป็นเพียงสตริง

คุณต้องเพิ่มเครื่องหมายจุลภาคพิเศษในตอนท้ายเพื่อให้pythonใช้เป็นtuple: -

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>> 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.