Boş küme değişmez?


462

[] = boş list

() = boş tuple

{} = boş dict

Boş bir taslağa benzer bir gösterim var mı set? Yoksa yazmak zorunda mıyım set()?


12
[i] için [i için] i kabul etmiyorsunuz, değil mi?
utdemir

3
Sadece python ile neredeyse her şeyin mümkün olduğunu göstermek istiyorum. Set () öğesini kullanmadan bir küme oluşturmak istiyorsanız, bunu yapabilirsiniz.
utdemir

6
Evet, hemen hemen her şeyi yüzlerce kıvrımlı şekilde yapabilirsiniz. map(lambda x: x)Kod örneklerine sadece size de çalıştığını göstermek için eklemem . Bu bir dizi değişmez bilgi değil, sadece bir dizi kavrama.

130
İşe yarayan aptal bir yol olurdu {0}-{0}. O kadar net değil set(), ama komik bir çift göz gibi görünme avantajına sahip.
wim

10
@Chris {}bir sözlüktür. {0}bir kümedir. {0} - {0}bir kümenin kendisi ile boş küme arasındaki farktır.
michaelsnowden

Yanıtlar:


520

Hayır, boş küme için gerçek bir sözdizimi yoktur. Yazmak zorundasın set().


Boş küme için gerçek bir sözdizimi yok mu demek istiyorsun? Yoksa genel olarak setler için mi?
Johan Råde

15
Belirlenmiş değişmez değerler vardır, ancak yalnızca Python 3.x'te. Her iki şekilde de boş setler için bir kelime bilgisi yoktur.

2
@ user763305: Dil kılavuzu bu noktada oldukça açık. docs.python.org/library/stdtypes.html#set-types-set-frozenset , "boş olmayan kümeler ... ayraçların içine virgülle ayrılmış öğeler listesi yerleştirilerek oluşturulabilir" diyor
S.Lott

44
Aslında, set değişmez değerleri Python 2.7'ye geri bildirildi, bu yüzden sadece Python 3'te mevcut değiller
Jim Brissom

13
@andy Bu boş bir küme değil - bu 1 sayısını içeren bir kümedir. Bu arada sondaki virgüllere ihtiyacınız yoktur - bu sadece tuples için gereklidir.
sepp2k

54

Elbette, boş bir küme oluşturmak için lütfen kullanın set() .

Ancak, insanları etkilemek istiyorsanız, onlara harfleri kullanarak ve *Python> = 3.5 ( bkz. PEP 448 ) ile boş bir küme oluşturabileceğinizi söyleyin :

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

bu temel olarak daha yoğun bir yol {_ for _ in ()}, ama bunu yapma.


Neden?! Performans neredeyse aynı:$ 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()anlaşılması çok daha kolaydır (kod koruyucular için) ve bu genellikle performanstan daha önemlidir. {*()}neredeyse aşağılayıcı bir anlamda "zekice" görünüyor.
benjimin

Heh, bu akıllıca.
Kowalski

46

Sadece kabul edilen cevabı uzatmak için:

Versiyondan 2.7ve 3.1pythondan setkelimenin tam anlamıyla {}kullanım şekli var {1,2,3}, ancak {}kendisi hala boş dikte için kullanılıyor.

Python 2.7 (Python <2.7'de ilk satır geçersiz)

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

Python 3.x

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

Daha fazla bilgi için: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes


12
Bu cevap yanlış. Boş bir kümeyi temsil eden gerçek bir sözdizimi hala yoktur. {}.__class__yine de verecekdict
Ninja420

8
@ Ninja420 ilk yorumdan önce okumaya çalışıyorum, bunu fark ettim
Reishin

3
Kabul edilen cevap hala doğru ve modası geçmiş değil. Boş küme için gerçek bir sözdizimi yoktur, ancak boş sözlük için bir sözdizimi yoktur .
AndreasHassing

2
@ AndreasBjørn boş bir evet için, ancak boş olmayan için PEP8 istisna ve set değişmezi kullanmak için öneri alırsınız.
Reishin

Aslında, {}.__class__döner <class 'dict'>'pyt3.6, onunla değil<type 'dict'>
klew

6

Değişmezi karşılaştırma veya atama için isteyip istemediğinize bağlıdır.

Varolan bir kümeyi boş yapmak istiyorsanız .clear(), özellikle yeni bir nesne oluşturmaktan kaçınmak istiyorsanız, yöntemi kullanabilirsiniz . Bir karşılaştırma yapmak istiyorsanız set(), uzunluğun 0 olup olmadığını kullanın veya kontrol edin.

misal:

#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()gelmez seti boşaltın , ancak yeni bir dizi oluşturur ve atar aönceki değerin üzerine yazmaktan.
gerrit

Aslında. Bu yüzden, yeni bir nesne oluşturmaktan kaçınmak istiyorsanız, clear () kullanmanız gerektiğini söyledim. Yorumumun biraz farklı ifade edilmiş olması gerektiğini düşünüyorum.
Brian Minton

Aynı zamanda a.clear()yöntemi kullanmaktan biraz daha hızlı a=set()ve kontrol len(a)==0eşitliği kontrol etmekten biraz daha hızlı görünüyora==set()
Brian Minton

3
Bunun yerine if len(a)==0:sadece yazmak if a: (düzenlemek: veya daha doğrusu if not a:durumun polaritesiyle eşleşmek ) yeterlidir (ve daha Pythonic'tir ).
Jim Oldfield

2

Çılgın fikirlere ek olarak: Python 3 unicode tanımlayıcıları kabul ederken, bir değişken ϕ = frozenset()bildirebilir (U U + 03D5'tir) ve bunun yerine kullanabilirsiniz.


4
Sorun şu ki, setnesneler değiştirilebilir, bu yüzden kendinizi riske atıyorsunuz spam = ϕ; spam.add("eggs").
drdaeman

3
Eğer ϕbir frozenset, sonra spam.add("eggs")frozenset nesne, herhangi bir olmadığı için, başarısız addbir yöntem.
Brian Minton

1
@BrianMinton: Ama amaçlanan davranış budur. Birisi span = ϕher ikisini yazdığında spanve ϕaynı nesneyi gösterdiğinde, yani id(span) == id(ϕ). Bu nedenle, eğer spam.add("eggs")işe ϕyararsa , nesne artık boş bir set olmayacak ve drdaeman'ın işaret ettiği orijinal soruna geri döneceğiz
Renato Garcia

1
@RenatoGarcia Boş dict literal ile karşılaştır:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton

1

Evet. Boş olmayan dikte / set için çalışan aynı gösterim boş olanlar için de geçerlidir.

Boş olmayan dictve setdeğişmez değerler arasındaki farka dikkat edin :

{1: 'a', 2: 'b', 3: 'c'}- anahtar değer çiftleri bir dizi içinde bir yapar dict
{'aaa', 'bbb', 'ccc'}- bir demet değerler içinde bir yaparset

Yani:

{}== anahtar / değer çiftlerinin sıfır sayısı == boş dict
{*()}== boş değer grubu == boşset

Ancak bunu yapabileceğiniz gerçeği, yapmanız gerektiği anlamına gelmez. Bazı güçlü nedenleriniz olmadıkça, boş bir kümeyi açıkça oluşturmak daha iyidir, örneğin:

a = set()

NB : As ctrueden yorumlarda fark {()}olduğunu değil boş bir set. 1 elemanlı bir set: boş tuple.


2
{()}boş küme değil. Bir elemanlı tek bir settir: boş bir demet. İ işaretleyerek doğrulayabilirsiniz len({()})1, ya da hangi () in {()}olacak olan True.
ctrueden

1
Hata! Haklısın! Gönderiyi güncelledim: {()}başka birinin aynı hatayı yapması durumunda boş bir set olmamasına ilişkin not ekledim . Teşekkürler @ctrueden!
pycoder

-1

Python'da boş Set oluşturmanın birkaç yolu vardır:

  1. Set () yöntemini kullanma
    Bu, bu değişkende Boş kümeyi oluşturan python içindeki yerleşik yöntemdir.
  2. Clear () yöntemini kullanma (creative Engineer Technique LOL)
    Bu örneğe bakın:

    set = {"Merhaba", "Nasıl", "", "Siz", "Tümü"}
    tür (kümeleri) (Bu Satır Çıkışı: küme)
    kümeleri .clear ()
    print (ayarlar) (Bu Satır Çıkışı: {})
    tür (ayarlar) (Bu Satır Çıkışı: küme)

Yani, Bu boş Set oluşturmanın 2 yoludur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.