Tập trống rỗng theo nghĩa đen?


461

[] = trống list

() = trống tuple

{} = trống dict

Có một ký hiệu tương tự cho một sản phẩm nào set? Hay tôi phải viết set()?


12
bạn không chấp nhận {i cho tôi trong []}, phải không?
utdemir

3
Chỉ muốn hiển thị gần như mọi thứ có thể với python. Nếu bạn muốn tạo một tập hợp mà không sử dụng để đặt (), bạn có thể.
utdemir

6
Vâng, bạn có thể làm khá nhiều thứ theo một trăm cách khó hiểu. Tôi không thêm map(lambda x: x)vào các ví dụ mã của mình chỉ để cho bạn thấy nó hoạt động. Nó cũng không phải là một tập hợp theo nghĩa đen, nó chỉ là một sự hiểu biết tập hợp.

130
Một cách ngu ngốc mà làm việc sẽ được {0}-{0}. Nó không rõ ràng như set(), nhưng nó có lợi thế là trông giống như một đôi mắt ngộ nghĩnh.
wim

10
@Chris {}là một cuốn từ điển. {0}là một bộ. {0} - {0}là sự khác biệt giữa một tập hợp và chính nó, là tập hợp trống.
michaelsnowden

Câu trả lời:


519

Không, không có cú pháp theo nghĩa đen cho tập hợp trống. Bạn phải viết set().


Bạn có nghĩa là không có cú pháp bằng chữ cho tập hợp trống? Hoặc cho các bộ nói chung?
Johan Råde

15
Có tập hợp chữ, nhưng chỉ trong Python 3.x. Không có nghĩa đen cho các bộ trống theo cách nào.

2
@ user763305: Hướng dẫn ngôn ngữ khá rõ ràng về điểm này. docs.python.org/l Library / stdtypes.html # set- type -set- frundredet nói rằng "các tập hợp không trống ... có thể được tạo bằng cách đặt danh sách các phần tử được phân tách bằng dấu phẩy trong dấu ngoặc"
S.Lott

43
Trên thực tế, tập hợp các chữ đã được nhập vào Python 2.7, vì vậy chúng không chỉ có sẵn trong Python 3.
Jim Brissom

13
@andy Đó không phải là một tập hợp trống - đó là một tập hợp có chứa số 1. Bạn không cần dấu phẩy bằng cách này - điều đó chỉ bắt buộc đối với các bộ dữ liệu.
sepp2k

54

Bằng mọi cách, vui lòng sử dụng set() để tạo một bộ trống.

Nhưng, nếu bạn muốn gây ấn tượng với mọi người, hãy nói với họ rằng bạn có thể tạo một tập hợp trống bằng chữ và *với Python> = 3.5 ( xem PEP 448 ) bằng cách thực hiện:

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

về cơ bản, đây là một cách làm cô đọng hơn {_ for _ in ()}, nhưng, đừng làm điều này.


Tại sao?! Hiệu suất gần như giống hệt nhau:$ 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()có thể dễ hiểu hơn nhiều (đối với người duy trì mã) và điều đó thường quan trọng hơn hiệu năng. {*()}có vẻ "thông minh" trong một ý nghĩa gần như miệt thị.
benjimin

Heh, thật thông minh.
Cửu Long

46

Chỉ để mở rộng câu trả lời được chấp nhận:

Từ phiên bản 2.73.1python đã có setnghĩa đen {}ở dạng sử dụng {1,2,3}, nhưng {}bản thân nó vẫn được sử dụng cho dict rỗng.

Python 2.7 (dòng đầu tiên không hợp lệ trong Python <2.7)

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

Python 3.x

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

Xem thêm tại đây: https://docs.python.org/3/whatsnew/2.7.html#other-lingu-changes


12
Câu trả lời này là sai. Vẫn không có cú pháp bằng chữ để biểu thị một tập hợp trống. {}.__class__vẫn sẽ chodict
Ninja420

8
@ Ninja420 hãy thử đọc trước khi bình luận, tôi đã nhận thấy rằng
Reishin

3
Câu trả lời được chấp nhận vẫn đúng và không bị lỗi thời. Không có một cú pháp bằng chữ cho tập hợp trống , tuy nhiên có một cú pháp cho từ điển trống.
AndreasHassing

2
@ AndreasBjørn cho một cái trống có, tuy nhiên đối với không trống, bạn sẽ nhận được ngoại lệ và đề xuất PEP8 để sử dụng tập hợp bằng chữ.
Reishin

thực tế, {}.__class__trả về <class 'dict'>'với pyt3.6, chứ không phải<type 'dict'>
klew

6

Nó phụ thuộc vào việc bạn muốn nghĩa đen để so sánh, hoặc cho bài tập.

Nếu bạn muốn làm cho một bộ hiện có trống, bạn có thể sử dụng .clear()metod, đặc biệt nếu bạn muốn tránh tạo một đối tượng mới. Nếu bạn muốn làm một so sánh, sử dụngset() hoặc kiểm tra nếu độ dài bằng 0.

thí dụ:

#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()không làm trống bộ , nhưng tạo một bộ mới và gán nó cho a, ghi đè bất kỳ giá trị nào trước đó.
gerrit

Thật. Đó là lý do tại sao tôi nói rằng nếu bạn muốn tránh tạo một đối tượng mới, bạn nên sử dụng Clear (). Tôi cho rằng bình luận của tôi nên được diễn đạt hơi khác nhau.
Brian Minton

Nó cũng xuất hiện bằng cách sử dụng a.clear()phương pháp nhanh hơn một chút a=set()và kiểm tra len(a)==0nhanh hơn một chút so với kiểm tra sự bằng nhaua==set()
Brian Minton

3
Thay vì if len(a)==0:nó đủ (và nhiều Pythonic) để viết chỉ if a: (chỉnh sửa: hoặc đúng hơn, if not a:để phù hợp với sự phân cực của điều kiện).
Jim Oldfield

2

Thêm vào những ý tưởng điên rồ: với Python 3 chấp nhận mã định danh unicode, bạn có thể khai báo một biến ϕ = frozenset()(là U + 03D5) và sử dụng nó để thay thế.


4
Vấn đề là, setcác đối tượng có thể thay đổi, vì vậy bạn đang tự đặt mình vào nguy cơ spam = ϕ; spam.add("eggs").
drdaeman

3
nếu ϕlà một froundredet, thì spam.add("eggs")thất bại, bởi vì đối tượng froundredet không có bất kỳ addphương thức nào .
Brian Minton

1
@BrianMinton: Nhưng đó là hành vi dự định. Lưu ý rằng khi ai đó viết span = ϕcả hai spanϕsẽ trỏ đến cùng một đối tượng, nghĩa là id(span) == id(ϕ). Do đó, nếu spam.add("eggs")hoạt động, ϕđối tượng sẽ không còn là một tập hợp trống nữa và chúng ta sẽ quay trở lại vấn đề ban đầu như được chỉ ra bởi drdaeman
Renato Garcia

1
@RenatoGarcia So sánh với nghĩa đen trống rỗng:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton

1

Đúng. Ký hiệu tương tự hoạt động cho dict / set không trống hoạt động cho những cái trống.

Lưu ý sự khác biệt giữa không trống dictvà nghĩa setđen:

{1: 'a', 2: 'b', 3: 'c'}- một số cặp khóa-giá trị bên trong tạo nên một dict
{'aaa', 'bbb', 'ccc'}- một bộ giá trị bên trong tạo nên mộtset

Vì thế:

{}== không có số cặp giá trị khóa == trống dict
{*()}== bộ dữ liệu trống == trốngset

Tuy nhiên, thực tế là bạn có thể làm điều đó, không có nghĩa là bạn nên làm vậy. Trừ khi bạn có một số lý do mạnh mẽ, tốt hơn là nên xây dựng một bộ trống rõ ràng, như:

a = set()

NB : Như ctrueden nhận thấy trong các ý kiến, {()}không một tập rỗng. Đó là một bộ có 1 phần tử: tuple trống.


2
{()}không phải là tập hợp trống. Nó là một tập hợp đơn với một phần tử: một tuple trống. Bạn có thể xác minh điều này bằng cách kiểm tra len({()})cái nào sẽ là 1, hoặc () in {()}cái nào sẽ là True.
ctrueden

1
Rất tiếc, bạn đã đúng! Tôi đã cập nhật bài viết: thêm ghi chú về việc {()}không phải là một tập hợp trống, trong trường hợp người khác mắc lỗi tương tự. Cảm ơn bạn, @ctrueden!
pycoder

-1

Có một số cách để tạo Set trống trong Python:

  1. Sử dụng phương thức set ()
    Đây là phương thức dựng sẵn trong python tạo ra tập hợp rỗng trong biến đó.
  2. Sử dụng phương pháp () rõ ràng (sáng tạo Kỹ sư Kỹ thuật LOL)
    Xem ví dụ này:

    bộ = { "Hi", "Làm thế nào", "là", "Bạn", "Tất cả"}
    loại (bộ) (Đây Output Line: bộ)
    bộ .clear ()
    print (sets) (This Line Output: {})
    type (sets) (This Line Output: set)

Vì vậy, đây là 2 cách để tạo Set trống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.