Двойное вложение defaultdict - PullRequest
       15

Двойное вложение defaultdict

1 голос
/ 13 февраля 2020

Обшарил, но не смог разобраться, возможно, очень простое решение, но, пожалуйста, помогите мне понять.

Источник (sample.txt):

1,1,2,3
2,3,2,4,4

Это:

import csv
from collections import defaultdict

input = "sample.txt"

with open(input) as f:
    r = csv.reader(f)
    d = defaultdict(list)
    rlabel = 1

    for row in r:
        d[rlabel].append(row)
        rlabel += 1

print(d)

Получает это:

defaultdict(<class 'list'>, {1: [['1', '1', '2', '3']], 2: [['2', '3', '2', '4', '4']]})

Почему в моих списках есть двойные скобки?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Почему в моих списках есть двойные скобки?

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

  • append добавляет параметр, который вы передали в качестве одного элемента. Поскольку список является объектом, а ваш класс defaultdict является списком, поэтому список добавляется в виде списка списков.

  • extend метод итерации в введите и расширьте исходный список, добавив все элементы из итерируемого.

Таким образом, в этом случае, если вы хотите добавить один список в свой defaultdict, вы должны использовать метод list.extend , И ваш вывод будет:

defaultdict(<class 'list'>, {1: ['1', '1', '2', '3'], 2: ['2', '3', '2', '4', '4']})
0 голосов
/ 13 февраля 2020

С помощью defaultdict при создании ключа ему присваивается значение по умолчанию

>>> d = defaultdict(list)
>>> 'a' in d[1]
False
>>> d
defaultdict(<class 'list'>, {1: []})

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

d[rlabel]+= row
...