2015-05-20 2 views
15

Я новичок в python, и я прочитал фрагмент кода из какого-то места. Это реализация сортировки.defaultdict со значением по умолчанию 1?

код, как показано ниже:

from collections import defaultdict 
def sort_colors(A): 
    ht = {}      # a hash map 
    ht = defaultdict(lambda:0, ht) # with default value 1 
    for i in A: 
     ht[i] += 1 
    ret = [] 
    for k in [0, 1, 2]: 
     ret.extend([k]*ht[k]) 
    return ret 

Как и в первых двух строках FUNC, это

ht = {} 
ht = defaultdict(lambda:0, ht) 

Я не совсем ясно, об этом initialization.Could вы любезно помочь мне фигуру это из? а также, мы просто заменим эти две строки следующим?

ht = defaultdict(int) # default value 0 
+3

пока вы импортируете из коллекций, может также просто использовать 'Counter'. – Kevin

+2

значение по умолчанию есть не 1, это 0. –

+2

Try' ХТ = defaultdict (лямбда : 1) # со значением по умолчанию 1' и удалить предыдущий 'ht = {}', который ничего не выполняет, поскольку вы изменяете значение 'ht' в следующей строке. – martineau

ответ

16
ht = {} 
ht = defaultdict(lambda:0, ht) 

defaultdict s отличаются от dict в том, что при попытке получить доступ к регулярному dict с помощью ключа, который не существует, он поднимает KeyError.
defaultdict, однако, не вызывает ошибки: вместо этого он создает ключ для вас. С какой ценностью? С возвратом callabe вы передали в качестве аргумента. В этом случае каждый новый ключ будет создан со значением 0 (который является возвратом простой функции lambdalambda:0), которая также имеет тот же доход int(), поэтому в этот случай, не было никакой разницы в изменение функции по умолчанию на int().

Ломая эту линию более подробно: ht = defaultdict(lambda:0, ht)

Первого аргумента является функцией, которая является вызываемым объектом. Это функция, которая будет вызываться для создания нового значения для несуществующего ключа. Второй аргумент ht является необязательным и относится к базовому словарю, на котором будет построен новый defaultdict. Поэтому, если ht имел некоторые ключи и значения, то defaultdict также имел бы эти ключи с соответствующими значениями. Если вы попытаетесь получить доступ к этим ключам, вы получите старые значения. Однако, если вы не пропустили базовый словарь, будет создан новый defaultdict, и, таким образом, все новые ключи, которые будут доступны, получат значение по умолчанию, возвращаемое вызываемым.
(В этом случае, как ht изначально пустой dict, то не было бы никакой разницы в этом ht = defaultdict(lambda:0), ht = defaultdict(int) или ht = defaultdict(lambda:0, ht): все они будут строить тот же defaultdict

+0

(lambda: 0, ht) может быть вызвано только 0? – chancyWu

+0

Это правильно. Я отредактировал сообщение, чтобы разбить его более подробно – RafaelC

+0

Интересно, что это! Где я могу узнать больше таких понятий? –

25

Я думаю, вы можете просто передать лямбда. функция, которая возвращает 1

d = defaultdict(lambda:1) 
+3

это правильно. а не принятый ответ. – jimh

Смежные вопросы