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]