Bir dikteyi başlatmak için tercih edilen sözdizimi nedir: kıvırcık ayraç değişmezleri {} veya dict () işlevi?


212

Python'u öğrenmek için biraz çaba harcıyorum ve ortak kodlama standartlarına çok dikkat ediyorum. Bu anlamsızca nit seçici bir soru gibi görünebilir, ancak öğrenirken en iyi uygulamalara odaklanmaya çalışıyorum, bu yüzden 'kötü' alışkanlıkları öğrenmem gerekmiyor.

Bir dikteyi başlatmak için iki yaygın yöntem görüyorum:

a = {
    'a': 'value',
    'another': 'value',
}

b = dict( 
    a='value',
    another='value',
)

Hangisi "daha pitonik" olarak kabul edilir? Hangisini kullanıyorsun? Neden?


5
Hangi öğreticiyi kullanıyorsunuz? Karışıklık yaratan örnekleri nerede gördünüz?
S.Lott

2
Python öğreticisini kullanıyorum, Python'a daldırın ve daha sonra çeşitli bloglar, SO yayınları ve diğer Googled kaynaklarını kullanıyorum. Resmi dokümanlar {}oldukça düzgün bir şekilde kullanılıyor, ancak dict()başka yerlerde açık yaklaşımların çoğunu görüyorum . Açık bir sözdiziminin faydasını görebiliyordum, ancak resmi belgelerde yaklaşımın olmaması beni şüpheli hale getirdi. Bunu gönderdikten sonra kütüphane belgelerine baktım ve bir dikteyi başlatmak dictiçin açık dictkullanıldığında anahtarların geçerli tanımlayıcılar olması gerektiğine dikkat ettim .
daotoad

2
"Dict ()", "{}" den nasıl daha açık? Karışıklıklarını anlamıyorum. Her ikisi de bana açık görünüyor. "Dict" ifadesinin "açık" olduğunu ve "{}" ifadesinin açık olmadığını söyleyen bir teklif veya referans verebilir misiniz? Sizce bu ayrım nereden çıktı?
S.Lott

21
Ayrım yazımdır. dict()yazıldığından dict- türün adını kullanır. Parantez ( {}), türü tanımlamak için noktalama işaretlerine dayanır.
daotoad

Yanıtlar:


235

Kıvırcık parantez. Anahtar kelime argümanlarını aktarmak dict(), birçok senaryoda güzel bir şekilde çalışmasına rağmen, yalnızca anahtarlar geçerli Python tanımlayıcılarıysa bir haritayı başlatabilir.

Bu çalışıyor:

a = {'import': 'trade', 1: 7.8}
a = dict({'import': 'trade', 1: 7.8})

Bu işe yaramaz:

a =                  dict(import='trade', 1=7.8)
>> SyntaxError: invalid syntax  ^

85

İlk, kıvırcık parantez. Aksi takdirde, içinde tuhaf karakterler bulunan tuşlarla tutarlılık sorunları yaşarsınız =.

# Works fine.
a = {
    'a': 'value',
    'b=c': 'value',
}

# Eeep! Breaks if trying to be consistent.
b = dict( 
    a='value',
    b=c='value',
)

11
Tam olarak bu nedenle, başlatma için dict () yöntemini tercih edebilir, sözlük anahtarlarını geçerli tanımlayıcılar olarak zorlar, bu nedenle örneğin ** kwargs ile uyumludur ve anahtarlar geçerli öznitelik adlarıdır.
RufusVS

57

İlk sürüm tercih edilir:

  • Her türlü anahtar için çalışır, böylece örneğin söyleyebilirsiniz {1: 'one', 2: 'two'}. İkinci varyant sadece (bazı) dize anahtarları için çalışır. Anahtarların türüne bağlı olarak farklı türlerde sözdizimi kullanmak gereksiz bir tutarsızlık olacaktır.
  • Bu daha hızlı:

    $ python -m timeit "dict(a='value', another='value')"
    1000000 loops, best of 3: 0.79 usec per loop
    $ python -m timeit "{'a': 'value','another': 'value'}"
    1000000 loops, best of 3: 0.305 usec per loop
  • Sözlük değişmezleri için özel sözdiziminin kullanılması amaçlanmamışsa, büyük olasılıkla mevcut olmaz.

3

Bence ilk seçenek daha iyi çünkü değerlere ['a'] veya ['başka'] olarak erişeceksiniz. Sözlüğünüzdeki anahtarlar dizgidir ve değilmiş gibi davranmak için bir neden yoktur. Bana göre anahtar kelime sözdizimi ilk bakışta akıllı, ancak ikinci bakışta anlaşılmaz görünüyor. Bu, yalnızca birlikte çalışıyorsanız __dict__ve anahtar kelimeler daha sonra öznitelik haline gelecekse, bunun gibi bir şey olduğunda bana mantıklı geliyor.


3

FYI, sözlüğünüze özellikler eklemeniz gerektiğinde (sözlüğe eklenmiş ancak anahtarlardan biri olmayan şeyler), ikinci forma ihtiyacınız olacaktır. Bu durumda sözlüğünüzü, birer birer rastgele karakterler içeren tuşlarla başlatabilirsiniz:

    class mydict(dict): pass
    a = mydict()        
    a["b=c"] = 'value'
    a.test = False

2

Bazen dict()iyi bir seçimdir:

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))

mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'],

[(0,7) aralığında x için rastgele. (0,100)]))


2
Bunu daha iyi yapabilen bir numaralandırma işlevi vardır. Bu nedenle, burada yaptıklarınızı daha iyi yapabilen bir Enum tipi var. Ayrıca, bu gerçekten sorunun cevabı değildir.
dusktreader

2

Neredeyse her zaman kıvırcık parantez kullanıyorum; Ancak, testler yazdığım bazı durumlarda, anahtar kelime paketleme / açma işlemini yaparım ve bu durumlarda değiştirmem gerekmediği için dict () çok daha sürdürülebilirdir:

a=1,
b=2,

için:

'a': 1,
'b': 2,

Ayrıca bazı durumlarda daha sonra adlandırılmış bir gruba veya sınıf örneğine dönüştürmek isteyebileceğimi düşünüyorum.

Uygulamada, optimizasyon konusundaki saplantım nedeniyle ve özellikle büyük bir sürdürülebilirlik avantajı görmediğimde, her zaman kıvırcık parantezleri tercih ederim.

Testler ve uygulamada, anahtarların daha sonra veya gelecekte eklenmesinin bir şansı varsa, asla dict () kullanmazdım:

  • Her zaman bir dize olmamak
  • Yalnızca rakam, ASCII harfi ve alt çizgi içermez
  • Bir tamsayı ile başlayın ( dict(1foo=2)bir SyntaxError oluşturur)
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.