[ad_1]
Programlama dillerinin tümü, her biri belirli iş türlerine uygun çeşitli veri yapıları ile birlikte gelir. Python, sözlük veya Python’da yerleşik veri yapıları arasında dict
, öne çıkıyor. Python sözlüğü, verileri yalnızca bir dizin numarası yerine bir ad veya hatta daha karmaşık bir nesne türü yoluyla depolamanın ve almanın hızlı ve çok yönlü bir yoludur.
Python sözlükleri bir veya daha fazla kelimeden oluşur. anahtarlar— bir dize veya tamsayı gibi bir nesne. Her bir anahtar bir değer, herhangi bir Python nesnesi olabilir. İlgili değerleri elde etmek için bir anahtar kullanırsınız ve her bir anahtar/değer çifti için arama süresi oldukça sabittir. Diğer dillerde, bu tür veri yapısına bazen karma harita veya ilişkisel dizi denir.
Bu makalede, nasıl kullanılacağı, mantıklı oldukları senaryolar ve dikkat edilmesi gereken bazı yaygın sorunlar ve tuzaklar dahil olmak üzere Python sözlüklerinin temellerini inceleyeceğiz.
Python sözlükleriyle çalışma
Basit bir Python sözlüğü örneği ile başlayalım:
movie_years = {
"2001: a space odyssey": 1968,
"Blade Runner": 1982
}
Bu sözlükte film adları anahtarlar ve yayın yılları değerlerdir. Yapı {key: value, key: value ... }
süresiz olarak tekrar edilebilir.
Burada gördüğümüz örneğe sözlük denir. gerçek—programın kaynağına kodlanmış bir sözlük yapısı. Sözlükler oluşturmak veya değiştirmek de mümkündür programlı olarakdaha sonra göreceğiniz gibi.
Sözlüklerdeki tuşlar
Bir Python sözlük anahtarı, neredeyse herhangi bir Python nesnesi olabilir. “Neredeyse” diyorum çünkü söz konusu nesne yıkanabilirolması gerektiği anlamına gelir karma değer (onun çıktısı __hash__()
yöntemi) ömrü boyunca değişmeyen ve diğer nesnelerle karşılaştırılabilen.
Hiç değişken Python nesnesinin ömrü boyunca tutarlı bir karma değeri yoktur ve bu nedenle anahtar olarak kullanılamaz. Örneğin, bir liste bir anahtar olamaz, çünkü bir listeye öğeler eklenebilir veya listeden çıkarılabilir. Aynı şekilde, bir sözlüğün kendisi de aynı nedenle anahtar olamaz. Ama bir demet Yapabilmek bir anahtar olun, çünkü bir demet değişmezdir ve bu nedenle ömrü boyunca tutarlı bir hash’e sahiptir.
Dizeler, sayılar (tamsayılar ve aynı şekilde kayan sayılar), demetler ve yerleşik tekil nesneler (True
, False
ve None
) anahtar olarak kullanılacak yaygın türlerdir.
Belirli bir anahtar, belirli bir sözlüğe özgüdür. Aynı anahtarın katları mümkün değildir. Birden çok değere işaret eden bir anahtara sahip olmak istiyorsanız, değer olarak liste, tanımlama grubu ve hatta başka bir sözlük gibi bir yapı kullanırsınız. (Kısa bir süre sonra bu konuda daha fazlası.)
sözlüklerdeki değerler
Sözlüklerdeki değerler şunlar olabilir: hiç Python nesnesi hiç. İşte bazı değer örnekleri:
example_values = {
"integer": 32,
"float": 5.5,
"string": "hello world",
"variable": some_var,
"object": some_obj,
"function_output": some_func(),
"some_list": [1,2,3],
"another_dict": {
"Blade Runner": 1982
}
}
Yine, bir anahtarda birden çok değer depolamak için, değer olarak bir kapsayıcı türü (liste, sözlük veya demet) kullanmanız yeterlidir. Yukarıdaki örnekte, tuşlar "some_list"
ve "another_dict"
sırasıyla listeleri ve sözlükleri tutun. Bu şekilde, ihtiyaç duyulan herhangi bir derinlikte iç içe yapılar oluşturabilirsiniz.
Yeni sözlükler oluşturma
Yalnızca şunu bildirerek yeni, boş bir sözlük oluşturabilirsiniz:
new_dict = {}
Ayrıca dict()
bir dizi çiftten yeni bir sözlük oluşturmak için yerleşik:
new_dict = dict(
(
("integer", 32), ("float", 5.5),
)
)
Sözlük oluşturmanın başka bir yolu da sözlük anlamabir dizideki anahtarları ve değerleri belirttiğiniz yer:
new_dict = {x:x+1 for x in range(3)}
# {0: 1, 1: 2, 2: 3}
Sözlük anahtarlarını ve değerlerini alma ve ayarlama
Bir sözlükten bir değer almak için Python’un indeksleme sözdizimini kullanırsınız:
example_values["integer"] # yields 32
# Get the year Blade Runner was released
blade_runner_year = movie_years["Blade Runner"]
Değer olarak bir kapsayıcınız varsa ve bir iç içe değer—yani, kapsayıcının içinden bir şey—ona doğrudan dizin oluşturma (destekleniyorsa) veya bir geçiş reklamı ataması kullanarak erişebilirsiniz:
example_values["another_dict"]["Blade Runner"] # yields 1982
# or ...
another_dict = example_values["another_dict"]
another_dict["Blade Runner"]
# to access a property of an object in a dictionary:
another_dict["some_obj"].property
Bir sözlükte bir değer ayarlamak yeterince basittir:
# Set a new movie and year
movie_years["Blade Runner 2049"] = 2017
Sözlük değerlerini güvenle almak için .get() kullanma
Belirli bir sözlükte olmayan bir anahtarı kullanarak bir değer almaya çalışırsanız, KeyError
istisna. Bu tür bir geri alma ile başa çıkmanın yaygın bir yolu, bir try/except
engellemek. Orada olmayabilecek bir anahtarı aramanın daha zarif bir yolu, .get()
yöntem.
bu .get()
sözlükteki yöntem, belirli bir anahtarla ilişkili bir değer bulmaya çalışır. Böyle bir değer yoksa, döner None
veya belirttiğiniz bir varsayılan. Bazı durumlarda, açıkça bir hata oluşturmak isteyeceksiniz, ancak çoğu zaman yalnızca aklı başında bir varsayılan sağlamak isteyeceksiniz.
my_dict = {"a":1}
my_dict["b"] # raises a KeyError exception
my_dict.get("a") # returns 1
my_dict.get("b") # returns None
my_dict.get("b", 0) # returns 0, the supplied default
Python sözlüğü ne zaman kullanılır?
Python sözlüklerini kullanmak, aşağıdaki koşullar altında en mantıklı olanıdır:
- Yalnızca konumları veya dizin numaralarını değil, adları kullanarak nesneleri ve verileri depolamak istiyorsunuz. Öğeleri dizin numaralarına göre alabilmek için saklamak istiyorsanız, bir liste kullanın. unutmayın Yapabilmek tamsayıları dizin anahtarları olarak kullanın, ancak bu, verileri listenin sonuna ekleme gibi eylemler için optimize edilmiş bir liste yapısında depolamakla tamamen aynı değildir. (Sözlükler, göreceğiniz gibi, “son” veya “başlangıç” öğelerine sahip değildir.)
- Verileri ve nesneleri ada göre hızlı bir şekilde bulmanız gerekir. Sözlükler, sözlük boyutundan bağımsız olarak anahtar aramalarının neredeyse her zaman sabit zamanda olması için optimize edilmiştir. Bir listedeki bir öğeyi sabit zamanda konumuna göre de bulabilirsiniz, ancak belirli bir öğeyi hızlı bir şekilde arayamazsınız – konumunu bilmiyorsanız belirli bir şeyi bulmak için bir listeyi yinelemeniz gerekir.
- Öğelerin sırası, varlıkları kadar önemli değildir. Yine, öğelerin sırası, koleksiyonda belirli bir öğenin bulunup bulunmadığından daha önemliyse, bir liste kullanın. Ayrıca, aşağıda not edeceğiniz gibi, sözlükler bu öğelerin eklendiği sırayı korurken, bu,
seek()
için nhızlı bir şekilde.
Sözlüklerdeki değerler için Gotchas
Sözlüklerde değerlerin nasıl çalıştığına dair kayda değer birkaç tuhaflık vardır.
İlk olarak, bir değişken ismi bir değer olarak, o anahtarın altında saklanan şey, değişkenin içerdiği değerdir. sözlük değeri tanımlandığında. İşte bir örnek:
some_var = 128
example_values = {
"variable": some_var,
"function_output": some_func()
}
Bu durumda belirlediğimiz some_var
tam sayıya 128
sözlüğü tanımlamadan önce. Anahtar "variable"
değeri içerecek 128
. Ama eğer değiştiysek some_var
sonrasında sözlük tanımlanmış, içeriğin "variable"
anahtar olumsuzluk değiştirmek. (Bu kural Python listeleri ve Python’daki diğer kapsayıcı türleri için de geçerlidir.)
Benzer bir kural, işlev çıktılarının sözlük değerleri olarak nasıl çalıştığına uygulanır. anahtar için "function_output"
sahibiz some_func()
. Bu, sözlük tanımlandığında, some_func()
yürütülür ve döndürülen değer, değer olarak kullanılır. "function_output"
. Fakat some_func()
dır-dir olumsuzluk anahtara her eriştiğimizde yeniden yürütülür "function_output"
. Bu değer, ilk yaratıldığı zamanki gibi kalacaktır.
Yeniden çalıştırmak istiyorsak some_func()
bu anahtara her eriştiğimizde, başka kullanımları da olan farklı bir yaklaşım benimsememiz gerekir.
Sözlüklerde işlev nesnelerini çağırma
İşlev nesneleri bir sözlükte değerler olarak saklanabilir. Bu, bazı anahtarlara dayalı işlev seçeneklerinden birini yürütmek için sözlükleri kullanmamıza olanak tanır; switch/case
diğer dillerde bulunan işlevler.
İlk olarak, fonksiyon nesnesini sözlükte saklarız, sonra onu alıp çalıştırırız:
def run_func(a1, a2):
...
def reset_func(a1, a2):
...
my_dict = {
"run": run_func,
"reset": reset_func
}
command = "run"
# execute run_func
my_dict[command](x, y)
# or ...
cmd = my_dict[command]
cmd(x, y)
Fonksiyonları tanımlamamız gerektiğini unutmayın. ilksonra bunları sözlükte listeleyin.
Ayrıca, 3.10 sürümünden itibaren Python, geleneksel modellere benzeyen yapısal desen eşleştirme adı verilen bir özelliğe sahiptir. switch/case
ifadeler. Ancak Python’da, eşleştirmek için kullanılması gerekiyordu. yapılar veya tür kombinasyonları, yalnızca tek değerler değil. Bir eylemi yürütmek için bir değer kullanmak veya başka bir değer döndürmek istiyorsanız, bir sözlük kullanın.
Sözlükler aracılığıyla yineleme
Tüm anahtarlarını veya değerlerini incelemek için bir sözlükte yineleme yapmanız gerekiyorsa, bunu yapmanın birkaç farklı yolu vardır. En yaygın olanı, bir for
sözlükte döngü—örn. for item in the_dict
. Bu anahtarlar gerektiğinde değerleri almak için kullanılabilecek sözlükte:
movie_years = {
"2001: a space odyssey": 1968,
"Blade Runner": 1982
}
for movie in movie_years:
print (movie)
Bu çağrı sonuç verir "2001: a space odyssey"
sonra "Blade Runner"
.
Bunun yerine aşağıdakileri kullanırsak:
for movie in movie_years:
print (movie_years[movie])
alırdık 1968
ve 1982
. Bu durumda, değerleri elde etmek için anahtarları kullanıyoruz.
Sadece değerleri istiyorsak, şununla yineleyebiliriz: .values()
sözlüklerde bulunan yöntem:
for value in movie_years.values():
Son olarak, hem anahtarları hem de değerleri birlikte elde edebiliriz. .items()
yöntem:
for key, value in movie_years.items():
Python sözlüklerinde sıralama
Sözlükler arasında yineleme yaparken fark edebileceğiniz bir şey, anahtarların genellikle eklendikleri sırayla döndürülmesidir.
Bu her zaman böyle değildi. Python 3.6’dan önce, bir sözlükteki öğeler, bunları yinelerseniz belirli bir sırayla döndürülmezdi. Sürüm 3.6, uygun bir yan etki olarak anahtarlar için ekleme sırasını koruyan yeni ve daha verimli bir sözlük algoritması sundu.
Daha önce, Python türü teklif etti koleksiyonlar.SıralıDict ekleme sırasını koruyan sözlükler oluşturmanın bir yolu olarak. collections.OrderedDict
standart kitaplıkta hala mevcuttur, çünkü mevcut yazılımların çoğu onu kullanır ve ayrıca normal dicts ile hala mevcut olmayan yöntemleri destekler. Örneğin, sunduğu reversed()
normal sözlüklerin yapmadığı, sözlük anahtarlarını ekleme sırasının tersine döndürmek için.
Öğeleri sözlüklerden kaldırma
Bazen bir anahtar/değer çiftini sözlükten tamamen kaldırmanız gerekir. Bunun için, del
yerleşik:
del movie_titles["Blade Runner"]
Bu, anahtar/değer çiftini kaldırır {"Blade Runner": 1982}
makalenin başındaki örneğimizden.
Bir anahtar veya değer ayarlamanın None
ile aynı değil kaldırma bu öğeler sözlükten. Örneğin, komut movie_titles["Blade Runner"] = None
sadece bu anahtarın değerini None
; anahtarı tamamen kaldırmaz.
Değerler yoluyla anahtar bulma
Sözlüklerle ilgili yaygın bir soru, bir değer arayarak bir anahtar bulmanın mümkün olup olmadığıdır. Kısa cevap hayırdır – en azından, doğru değeri (ve dolayısıyla onunla birlikte gitmek için doğru anahtarı) bulmak için anahtar/değer çiftlerini yinelemeden olmaz.
Kendinizi anahtarları değerleri aracılığıyla ve değerleri anahtarları aracılığıyla bulmanız gereken bir durumda bulursanız, birinin anahtarları ve değerleri ters çevirdiği iki sözlük tutmayı düşünün. Ancak, sakladığınız değerler hashable değilse bunu yapamazsınız. Böyle bir durumda, sözlükte yinelemeye başvurmanız ya da daha iyisi, gerçekten çözmeye çalıştığınız soruna daha zarif bir çözüm bulmanız gerekir.
Sözlükler ve kümeler
Son olarak, Python’un başka bir veri yapısı vardır: Ayarlamakyüzeysel olarak bir sözlüğe benzeyen. Bunu yalnızca anahtarları olan, ancak değerleri olmayan bir sözlük olarak düşünün. Sözdizimi de bir sözlüğe benzer:
movie_titles = {
"2001: a space odyssey",
"Blade Runner",
"Blade Runner 2049"
}
Ancak kümeler, belirli bir anahtarla ilişkili bilgileri depolamak için değildir. Esas olarak, varlıkları veya yoklukları için hızlı bir şekilde test edilebilecek şekilde yıkanabilir değerleri depolamak için kullanılırlar. Ayrıca, kullandıkları kod sözlük oluşturmak için kullanılan kodla aynı olmadığından kümeler ekleme sırasını korumaz.
Telif Hakkı © 2022 IDG Communications, Inc.
[ad_2]
Kaynak : https://www.infoworld.com/article/3665094/how-to-use-python-dictionaries.html#tk.rss_all