Python: использование метода Dictionary get для возврата пустого списка по умолчанию возвращает None!

в python я хотел бы создать словарь массивов, используя метод dictionary get, чтобы по умолчанию предоставить пустой список, а затем заполнить информацию, например:

dict = {}
for i in range( 0, 10 ):
    for j in range( 0, 100 ):
        dict[i] = dict.get( i, [] ).append( j )

однако, когда я пробую приведенный выше код, я не получаю исключений, но мой список заканчивается следующим образом:

AttributeError: объект "NoneType" не имеет атрибута "append"

списки имеют метод добавления, поэтому я упростил свой тест до следующий:

dict = {}
for i in range( 0, 10 ):
    dict[i] = dict.get( i, [] ).append( i )

и выход был следующим:

{0: Нет 1: Нет 2: Нет 3: Нет 4: Нет 5: Нет 6: Нет 7: Нет 8: Нет 9: Нет}

поэтому мой вопрос: почему это дикт.получить (i, [] ) возврат None по умолчанию, а не []? Делаю дикт.get (i, list ()) имеет ту же проблему, поэтому я немного в тупике.

5 ответов


это не dict.get( i, [] ) это возвращение None, это append. Вы, вероятно, хотите использовать dict.setdefault(i, []).append(j) или просто использовать defaultdict в первую очередь.

вот как вы это сделаете:

d = {}
for i in range( 0, 10 ):
    for j in range( 0, 100 ):
        d.setdefault( i, [] ).append( j )

обратите внимание, что я изменил dict to d, потому что dict уже означает что-то в Python (вы переопределяете его), и я удалил лишнее dict[i] = это вызвало сообщение об ошибке.


чтобы решить эту проблему, вам нужно использовать Python defaultdict.

http://docs.python.org/library/collections.html#defaultdict-examples

from collections import defaultdict 

dict = defaultdict(list)
for i in range( 0, 10 ):
    for j in range( 0, 100 ):
        dict[i].append( j )

проблема в том, что append возвращает None вместо объекта списка. Так что

dict[i] = dict.get( i, [] ).append( j ) не присваивает значение dict[i]

однако, вы можете сделать гораздо проще:

dict.setdefault( i, [] ).append( j )

.. цитирование документов для setdefault:

если ключ находится в словаре, верните его значение. Если нет, вставьте ключ со значением по умолчанию и верните default

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


append не возвращает список. Он добавляет значение в список и возвращает None.

вместо этого:

 dict[i] = dict.get( i, [] ).append( j ) 

вы могли бы сделать это:

 dict.setdefault(i, [])
 dict[i].append( j )

альтернатива, которая использует get метод, используя преимущества добавления списка.

d = {}
for i in range(0, 10):
    for j in range(0, 100):
        d[i] = d.get(i, []) + [j]