ใช้วงเล็บปีกกาเพื่อเริ่มต้น Set ใน Python


109

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

my_set = {'foo', 'bar', 'baz'}

มีข้อเสียหรือไม่ในการทำเช่นนี้ซึ่งต่างจากวิธีมาตรฐานของ:

my_set = set(['foo', 'bar', 'baz'])

หรือเป็นเพียงคำถามเกี่ยวกับสไตล์?


2
เอกสารกล่าวถึงมันไม่ใช่แค่ที่นั่น โปรดทราบว่านั่นคือเอกสารสำหรับโมดูลที่เลิกใช้แล้วตอนนี้ชุดจริงถูกสร้างขึ้นแล้ว อยู่ในเอกสาร "มีอะไรใหม่ใน Python 2.7" และการอ้างอิงภาษาอธิบายสั้น ๆ : docs.python.org/2/reference/expressions.html#set-displays

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

1
ตั้งแต่แก้ไขความคิดเห็นเอกสาร 2.7 ก็พูดถึงเรื่องนี้ด้วย ลิงก์ที่คุณโพสต์ล้าสมัยเป็นของที่ระลึกในอดีตไม่ถูกต้องเลิกใช้งานแล้ว อย่าลืมว่ามีอยู่และใช้สิ่งที่บอกให้คุณใช้แทน: docs.python.org/2/library/stdtypes.html#setและdocs.python.org/2/library/stdtypes.html#frozenset

@delnan ขอบคุณที่ช่วยฉันออกไป ฉันแก้ไขคำถามเพื่อไม่ให้บอกว่าไม่มีเอกสารประกอบอีกต่อไป (แม้ว่าจะมีตัวอย่างบางส่วนที่กล่าวถึงเรื่องนี้ทางออนไลน์)
fvrghl

สำหรับผู้สัญจร: Pycharm เตือนไม่ให้ใช้การเรียกใช้ฟังก์ชันเมื่อสามารถใช้ตัวอักษรได้ - อาจมีเหตุผลด้านประสิทธิภาพดังนั้นจึงควรตั้งค่าตามตัวอักษรในโค้ดใหม่
Mr_and_Mrs_D

คำตอบ:


108

มีปัญหาสองประการที่ชัดเจนเกี่ยวกับไวยากรณ์ set literal:

my_set = {'foo', 'bar', 'baz'}
  1. ไม่สามารถใช้ได้ก่อน Python 2.7

  2. ไม่มีวิธีแสดงชุดว่างโดยใช้ไวยากรณ์นั้น (ใช้{}สร้างคำสั่งว่าง)

สิ่งเหล่านี้อาจมีความสำคัญสำหรับคุณหรือไม่ก็ได้

ส่วนของเอกสารการสรุปรูปแบบนี้เป็นที่นี่


51

เปรียบเทียบความแตกต่างระหว่าง{}และset()ด้วยอาร์กิวเมนต์คำเดียว

>>> a = set('aardvark')
>>> a
{'d', 'v', 'a', 'r', 'k'} 
>>> b = {'aardvark'}
>>> b
{'aardvark'}

แต่ทั้งสองอย่างaและbเป็นชุดแน่นอน


6
นั่นเป็นเหตุผลที่ผมชอบที่จะเตือนตัวเองตัวสร้างชุดเป็นมากกว่าแค่set([]) set()
Michael Ekoka

4
set()ใช้อาร์กิวเมนต์เดียวเสมอ ทำซ้ำได้เพียงครั้งเดียว
George Kettleborough

1
@GeorgeKettleborough อาร์กิวเมนต์เดียวหรือไม่มีเลยหลังเพื่อสร้างชุดว่าง
gertvdijk

28

จากเอกสาร Python 3 ( เช่นเดียวกับ python 2.7 ):

Curly braces หรือฟังก์ชัน set () สามารถใช้เพื่อสร้างชุดได้ หมายเหตุ: ในการสร้างชุดว่างคุณต้องใช้ set () ไม่ใช่ {}; หลังสร้างพจนานุกรมว่างซึ่งเป็นโครงสร้างข้อมูลที่เราจะพูดถึงในส่วนถัดไป

ใน python 2.7:

>>> my_set = {'foo', 'bar', 'baz', 'baz', 'foo'}
>>> my_set
set(['bar', 'foo', 'baz'])

โปรดทราบว่า{}ยังใช้สำหรับmap/ dict:

>>> m = {'a':2,3:'d'}
>>> m[3]
'd'
>>> m={}
>>> type(m)
<type 'dict'> 

คุณยังสามารถใช้ไวยากรณ์ที่ครอบคลุมเพื่อเริ่มต้นชุด:

>>> a = {x for x in """didn't know about {} and sets """ if x not in 'set' }
>>> a
set(['a', ' ', 'b', 'd', "'", 'i', 'k', 'o', 'n', 'u', 'w', '{', '}'])

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