добавление Python и + = проблема с dict - PullRequest
0 голосов
/ 10 августа 2011

это кажется действительно простым, но я не знаю, в чем я ошибся.

d1 = dict(zip(range(10), [[]]*10))
l1 = zip(range(10), range(10,20))

for pair in l1:
    d1[pair[0]].append(pair)

результирующий d1:

>>> d1
{0: [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)], 1: [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)], 2: [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)], 3: [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)], 4: [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)], 5: [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)], 6: [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)], 7: [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)], 8: [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)], 9: [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)]}

с этим:

for pair in l1:
    d1[pair[0]] += [pair]

то же самое, но с:

for pair in l1:
    d1[pair[0]] = d1[pair[0]] + [pair]

это дает мне желаемый результат, который

>>> d1
{0: [(0, 10)], 1: [(1, 11)], 2: [(2, 12)], 3: [(3, 13)], 4: [(4, 14)], 5: [(5, 15)], 6: [(6, 16)], 7: [(7, 17)], 8: [(8, 18)], 9: [(9, 19)]}

Кажется, я упускаю что-то базовое в синтаксисе, кто-нибудь может это указать? спасибо ~

Alex

Ответы [ 2 ]

5 голосов
/ 10 августа 2011

Не используйте умножение с изменяемыми объектами. Он дает вам X ссылок на объект, а не X различных объектов.

d1 = dict((idx, []) for idx in range(10))
3 голосов
/ 10 августа 2011

Вместо [[]]*10, вы должны использовать

[[] for i in range(10)]

, поскольку первый просто создает список элементов, которые указывают на одну ссылку на массив.

Пример

>>> d1 = dict(zip(range(10), [[] for i in range(10)]))
>>> l1 = zip(range(10), range(10,20))
>>>
>>> for pair in l1:
...     d1[pair[0]].append(pair)
...
>>> d1
{0: [(0, 10)], 1: [(1, 11)], 2: [(2, 12)], 3: [(3, 13)], 4: [(4, 14)], 5: [(5, 1
5)], 6: [(6, 16)], 7: [(7, 17)], 8: [(8, 18)], 9: [(9, 19)]}
>>>
>>> d1
{0: [(0, 10)], 1: [(1, 11)], 2: [(2, 12)], 3: [(3, 13)], 4: [(4, 14)], 5: [(5, 1
5)], 6: [(6, 16)], 7: [(7, 17)], 8: [(8, 18)], 9: [(9, 19)]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...