ชุดตัวอักษรว่างเปล่า?


460

[] = ว่างเปล่า list

() = ว่างเปล่า tuple

{} = ว่างเปล่า dict

มีสัญกรณ์ที่คล้ายกันสำหรับที่ว่างเปล่าset? หรือฉันจะต้องเขียนset()?


12
คุณไม่ยอมรับ {i สำหรับฉันใน []} ใช่ไหม
utdemir

3
เพียงแค่ต้องการแสดงเกือบทุกอย่างที่เป็นไปได้ด้วยหลาม หากคุณต้องการสร้างชุดโดยไม่ใช้ set () คุณสามารถทำได้
utdemir

6
ใช่คุณสามารถทำได้ทุกอย่างในร้อยวิธีที่ดูถูก ฉันไม่ได้เพิ่มmap(lambda x: x)ตัวอย่างรหัสเพื่อแสดงให้คุณเห็นว่าใช้ได้ดี มันไม่ใช่ชุดตัวอักษรเช่นกันมันเป็นเพียงความเข้าใจชุด

130
{0}-{0}วิธีใบ้ที่ทำงานจะเป็น มันไม่ชัดเจนเหมือนset()แต่มันมีข้อดีของการมองเหมือนคู่หูตลก
Wim

10
@Chris {}เป็นพจนานุกรม {0}เป็นชุด {0} - {0}คือความแตกต่างระหว่างชุดกับตัวเองซึ่งเป็นชุดที่ว่างเปล่า
michaelsnowden

คำตอบ:


520

ไม่ไม่มีไวยากรณ์ที่แท้จริงสำหรับชุดที่ว่างเปล่า set()คุณต้องเขียน


คุณหมายถึงไม่มีไวยากรณ์ที่แท้จริงสำหรับชุดว่างหรือไม่ หรือชุดทั่วไป?
Johan Råde

15
มีชุดตัวอักษร แต่เฉพาะใน Python 3.x ไม่มีตัวอักษรสำหรับชุดที่ว่างเปล่าอย่างใดอย่างหนึ่ง

2
@ user763305: คู่มือภาษาค่อนข้างชัดเจนในจุดนี้ docs.python.org/library/stdtypes.html#set-types-set-frozensetบอกว่า "ชุดที่ไม่ว่างเปล่า ... สามารถสร้างได้โดยการวางรายการองค์ประกอบที่คั่นด้วยเครื่องหมายจุลภาคภายในเครื่องหมายวงเล็บ"
S.Lott

43
อันที่จริงชุดตัวอักษรได้รับการ backported เพื่อ Python 2.7 ดังนั้นพวกเขาจะไม่สามารถใช้ได้เฉพาะใน Python 3 อย่างเคร่งครัด
จิมบริสซัม

13
@ Andy นั่นไม่ใช่ชุดที่ว่างเปล่า - เป็นชุดที่มีหมายเลข 1 คุณไม่จำเป็นต้องใช้เครื่องหมายจุลภาคต่อท้าย - มันจำเป็นสำหรับ tuples เท่านั้น
sepp2k

53

โดยทั้งหมดโปรดใช้ set()เพื่อสร้างชุดที่ว่างเปล่า

แต่ถ้าคุณต้องการสร้างความประทับใจให้ผู้คนบอกพวกเขาว่าคุณสามารถสร้างชุดว่างโดยใช้ตัวอักษรและ*ด้วย Python> = 3.5 ( ดู PEP 448 ) โดยทำดังนี้

>>> s = {*()}  # or {*{}} or {*[]}
>>> print(s)
set()

นี่เป็นวิธีที่ทำแบบย่อมากกว่า{_ for _ in ()}แต่อย่าทำแบบนี้


ทำไม?! ประสิทธิภาพเกือบเหมือนกัน:$ python3.7 -m timeit 'set()' 2000000 loops, best of 5: 177 nsec per loop $ python3.7 -m timeit '{*()}' 2000000 loops, best of 5: 171 nsec per loop
ogurets

9
@ogurets set()มีแนวโน้มที่จะเข้าใจได้ง่ายขึ้น (สำหรับผู้ดูแลโค้ด) และมักจะสำคัญกว่าประสิทธิภาพ {*()}ดูเหมือนว่า "ฉลาด" ในแง่ที่เกือบดูถูก
benjimin

เฮ้มันฉลาด
สกี้

46

เพียงเพื่อขยายคำตอบที่ยอมรับได้:

จาก version 2.7และ3.1python มีsetตัวอักษร{}ในรูปแบบการใช้งาน{1,2,3}แต่{}ตัวมันเองยังคงใช้สำหรับ dict ที่ว่าง

Python 2.7 (บรรทัดแรกไม่ถูกต้องใน Python <2.7)

>>> {1,2,3}.__class__
<type 'set'>
>>> {}.__class__
<type 'dict'>

Python 3.x

>>> {1,4,5}.__class__
<class 'set'>
>>> {}.__class__
<type 'dict'>

เพิ่มเติมได้ที่นี่: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes


12
คำตอบนี้ผิด ยังไม่มีไวยากรณ์ตามตัวอักษรเพื่อแสดงชุดว่าง {}.__class__จะยังคงให้dict
Ninja420

8
@ Ninja420 ลองอ่านก่อนแสดงความคิดเห็นก่อนหน้านี้ฉันสังเกตเห็นแล้วว่า
Reishin

3
คำตอบที่ยอมรับยังคงถูกต้องและไม่ล้าสมัย ไม่มีไวยากรณ์ตามตัวอักษรสำหรับชุดว่างแต่มีหนึ่งสำหรับพจนานุกรมว่าง
AndreasHassing

2
@ AndreasBjørnสำหรับการใช่ใช่ แต่สำหรับการไม่ว่างคุณจะได้รับข้อยกเว้น PEP8 และข้อเสนอแนะเพื่อใช้ชุดตัวอักษร
Reishin

อันที่จริง{}.__class__กลับมา<class 'dict'>'พร้อมกับ pyt3.6 ไม่ใช่<type 'dict'>
klew

6

มันขึ้นอยู่กับว่าคุณต้องการตัวอักษรสำหรับการเปรียบเทียบหรือการมอบหมาย

หากคุณต้องการทำให้ชุดที่มีอยู่ว่างคุณสามารถใช้.clear()metod โดยเฉพาะถ้าคุณต้องการหลีกเลี่ยงการสร้างวัตถุใหม่ หากคุณต้องการทำการเปรียบเทียบให้ใช้set()หรือตรวจสอบว่าความยาวเท่ากับ 0 หรือไม่

ตัวอย่าง:

#create a new set    
a=set([1,2,3,'foo','bar'])
#or, using a literal:
a={1,2,3,'foo','bar'}

#create an empty set
a=set()
#or, use the clear method
a.clear()

#comparison to a new blank set
if a==set():
    #do something

#length-checking comparison
if len(a)==0:
    #do something

8
a=set()ไม่ลบชุดแต่สร้างชุดใหม่และกำหนดให้aแทนที่ค่าก่อนหน้านี้
gerrit

จริง นั่นเป็นเหตุผลที่ฉันพูดว่าถ้าคุณต้องการหลีกเลี่ยงการสร้างวัตถุใหม่คุณควรใช้ clear () ฉันคิดว่าความคิดเห็นของฉันควรได้รับการพูดแตกต่างกันเล็กน้อย
Brian Minton

นอกจากนี้ยังปรากฏว่าใช้a.clear()วิธีนี้เร็วกว่าเล็กน้อยa=set()และการตรวจสอบlen(a)==0เร็วกว่าการตรวจสอบความเท่าเทียมกันเล็กน้อยa==set()
Brian Minton

3
แทนที่จะif len(a)==0:เป็นพอเพียง (และเป็น Pythonic มากกว่า) ที่จะเขียนif a: (แก้ไข: หรือมากกว่าif not a:เพื่อให้ตรงกับสภาพของขั้ว)
จิมโอลด์ฟิลด์

2

การเพิ่มความคิดที่บ้าคลั่ง: ด้วย Python 3 ที่รับตัวระบุ Unicode คุณสามารถประกาศตัวแปรϕ = frozenset()(ϕ คือ U + 03D5) และใช้มันแทน


4
ปัญหาคือsetวัตถุไม่แน่นอนดังนั้นคุณต้องเสี่ยงกับspam = ϕ; spam.add("eggs")มัน
drdaeman

3
ถ้าϕเป็น frozenset แล้วspam.add("eggs")ล้มเหลวเนื่องจากวัตถุ frozenset ไม่มีaddวิธีการใด ๆ
Brian Minton

1
@BrianMinton: แต่นั่นเป็นพฤติกรรมที่ตั้งใจไว้ โปรดทราบว่าเมื่อมีคนเขียนspan = ϕทั้งสองspanและจะชี้ไปที่วัตถุเดียวกันคือϕ id(span) == id(ϕ)ดังนั้นหากspam.add("eggs")ทำงานได้ϕวัตถุจะไม่ว่างเปล่าอีกต่อไปและเราจะกลับไปที่ปัญหาดั้งเดิมตามที่ดร. เด
นาโตการ์เซีย

1
@RenatoGarcia เปรียบเทียบกับตัวอักษร dict ที่ว่างเปล่า:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton

1

ใช่. สัญกรณ์เดียวกันที่ใช้งานได้กับ dict / set ที่ไม่ว่างเปล่าใช้ได้กับวัตถุที่ว่าง

สังเกตเห็นความแตกต่างระหว่างที่ไม่ว่างเปล่าdictและsetตัวอักษร:

{1: 'a', 2: 'b', 3: 'c'}- คู่ของคีย์ - ค่าจำนวนหนึ่งอยู่ภายในทำให้ a dict
{'aaa', 'bbb', 'ccc'}- tupleของค่าภายในทำให้set

ดังนั้น:

{}== จำนวนคู่ของคีย์ - ค่าศูนย์ == empty dict
{*()}== tuple ที่ว่างเปล่าของค่า == emptyset

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

a = set()

หมายเหตุ : ในฐานะctruedenสังเกตเห็นในความคิดเห็น{()}เป็นไม่ได้ชุดที่ว่างเปล่า มันเป็นชุดที่มี 1 องค์ประกอบ: tuple ที่ว่างเปล่า


2
{()}ไม่ใช่ชุดที่ว่างเปล่า มันเป็นชุดเดี่ยวที่มีองค์ประกอบหนึ่ง: tuple ที่ว่างเปล่า คุณสามารถตรวจสอบโดยการตรวจสอบlen({()})ซึ่งจะเป็น 1 หรือซึ่งจะเป็น() in {()} True
ctrueden

1
อ๊ะคุณพูดถูก! ฉันอัปเดตโพสต์: เพิ่มบันทึกย่อเกี่ยวกับการ{()}ไม่เป็นชุดว่างเปล่าในกรณีที่คนอื่นทำผิดพลาดเหมือนกัน ขอบคุณ @ctrueden!
pycoder

-1

มีสองสามวิธีในการสร้างชุดเปล่าใน Python:

  1. Using set () method
    นี่เป็นวิธีการในตัวของไพ ธ อนที่สร้างชุดเปล่าในตัวแปรนั้น
  2. การใช้ที่ชัดเจน () วิธีการ (ความคิดสร้างสรรค์วิศวกรเทคนิคฮ่า ๆ )
    ดูตัวอย่างนี้

    ชุด = { "สวัสดี" "วิธีการ", "มี", "คุณ", "ทั้งหมด"}
    ประเภท (ชุด) (ซึ่งเอาท์พุท: ชุด)
    ชุด .clear ()
    พิมพ์ (ชุด) (เอาท์พุทสายนี้: {})
    ประเภท (ชุด) (เอาท์พุทสายนี้: ชุด)

ดังนั้นนี่คือ 2 วิธีในการสร้างชุดว่างเปล่า

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