Рубрики
Без рубрики

Тигеу: DefaultDict

Фото Келли Сиккема на Unsplash В недавнем PR -обзоре, используя DefaultDict вместо обычного DIC … Tagned с Python, TodayIsised, TodayIlearned.

фото Келли Сиккема на Неспособный

В недавнем PR -обзоре было предложено использование DefaultDict вместо обычного словаря. Никогда не работая с DefaultDict, мне нужно было уделить минутку, чтобы понять предложенный рефактор.

Ведя с темой, вот еще один выпуск Вещи, которые я Google Каждую неделю Сосредоточившись на DefaultDict.

DefaultDict Python ведет себя почти точно так же, как обычный словарь Python, однако, если вы попытаетесь получить доступ или изменить отсутствующий ключ DefaultDict, автоматически создаст ключ и генерирует значение по умолчанию.

Помните: словарь Python содержит ключ: пары значений, ключ должен быть уникальным и неизменным.

DefaultDict-это подкласс класса DICT, который возвращает словарь, похожий на словарь, и никогда не поднимает Keeerror из-за значения по умолчанию.

Это делает DefaultDict ценным вариантом для обработки пропущенных ключей в словарях.

Давайте сравним словарь и дефолт:

# Python dictionary 

st_dict = {1: 'Picard', 2: 'Spock', 3: 'Tasha Yar', 4: 'Data'}  
print("Star Trek Characters:")  
print(st_dict) 
print(st_dict[1]) 
print(st_dict[5])

# print(st_dict[5]) will raise a KeyError as
# the 5 key is not present in the dictionary 

Выход:

Star Trek Characters:
{1: 'Picard', 2: 'Spock', 3: 'Tasha Yar', 4: 'Data'}
Picard
Traceback (most recent call last): File "/home/dictionary_example.py",
line 7, in print(st_dict[5])
KeyError: 5

Теперь вот Defulatdict:

# Python defaultdict 

from collections import defaultdict 

# Function to return a default value for keys that are missing 
def def_value(): 
    return "Captains Log..."

# Defining the defaultdict 
st_dict = defaultdict(def_value) 
st_dict["Picard"] = "Captain"
st_dict["Spock"] = "Commander"
st_dict["Tasha Yar"] = "Lieutenant"
st_dict["Data"] = "Lieutenant Commander"

print(st_dict["Picard"]) 
print(st_dict["Spock"]) 
print(st_dict["Geordi"]) 

Выход:

Captain
Commander
Captains Log...

Увидеть разницу? С каким может быть легче справиться в вашем проекте?

Default_factory

Функция, представленная в определении по умолчанию, известна как default_factory.

Как общий к вашему сведению, если этот аргумент отсутствует в DefaultDict, он поднимает Keyerror Когда встречается недостающий ключ. Так же, как словарь.

# Python defaultdict - default_factory

from collections import defaultdict

# Defining the defaultdict
# using lambda this time
st_dict = defaultdict(lambda: "Captain's Log...")
st_dict["Picard"] = "Captain"
st_dict["Spock"] = "Commander"
st_dict["Tasha Yar"] = "Lieutenant"
st_dict["Data"] = "Lieutenant Commander"

print(st_dict["Picard"]) 
print(st_dict["Spock"]) 
print(st_dict["Geordi"]) 

Выход:

Captain
Commander
Captains Log...

отсутствует()

Метод возврата значения по умолчанию данного дефолта.

# Python defaultdict - __missing__()

from collections import defaultdict

# Defining the defaultdict
st_dict = defaultdict(lambda: "Captain's Log...")
st_dict["Picard"] = "Captain"
st_dict["Spock"] = "Commander"
st_dict["Tasha Yar"] = "Lieutenant"
st_dict["Data"] = "Lieutenant Commander"

print(st_dict.__missing__("Geordi"))
print(st_dict.__missing__("Worf"))
print(st_dict.__missing__("Picard"))

Выход:

Captain's Log...
Captain's Log...
Captain's Log...

Использование списка в качестве default_factory

Когда метод списка передается в качестве аргумента default_factory, тогда создается дефолт, который по умолчанию будет по умолчанию новые значения в пустой список.

# Python defaultdict - default_factory with list

from collections import defaultdict

# Defining the defaultdict
number_dict = defaultdict(list)

for i in range(5):
   number_dict[i].append(i)

print("Dictionary with list value:")
print(number_dict)

Выход:

Dictionary with list value:
defaultdict(, {0: [0], 1: [1], 2: [2], 3: [3], 4: [4]})

Использование int в качестве default_factory

Когда метод int передается в качестве аргумента default_factory, тогда по умолчанию создается значение по умолчанию как нулевое.

# Python defaultdict - default_factory with int

from collections import defaultdict

# Defining the defaultdict
numbers_dict = defaultdict(int)

numbers = [10, 20, 30 ]

# Iterate through the list
for i in numbers:
    numbers_dict[i] = i*2

print(numbers_dict)
print(numbers_dict[40])

Выход:

defaultdict(, {10: 20, 20: 40, 30: 60})
0
  1. Real Python – Использование типа Python DefaultDict для обработки пропущенных ключей
  2. Вундеркинды для гиков – DefaultDict в Python
  3. Accelebrate – Использование DefaultDict в Python

Оригинал: “https://dev.to/saramccombs/tigew-defaultdict-in-python-2e42”