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.