Создание defaultdict с помощью Counter против int против lambda - PullRequest
0 голосов
/ 15 апреля 2020

Я пишу код, в котором мне нужно вести подсчет различных слов в виде вложенного слова.

nestedCounts = defaultdict(lambda : defaultdict(int))
for j, tagList in enumerate(sequences_A):
    for a, b in zip(sequences_A[j], sequences_B[j]):
        nestedCounts[a][b] += 1

Когда я писал nestedCounts=defaultdict(int), он показал, что объект TypeError: 'int' не может быть подписан

Когда я изменил его на nestedCounts=defaultdict(Counter), он работал нормально.

Когда я изменил его на nestedCounts=defaultdict(lambda : defaultdict(int)), он также работал нормально.

Затем во втором случае Мне нужен был еще один дикт (не вложенный)

counts = defaultdict(int)
for i in range(len(sequences)):
    for j in sequences[i]:
        counts[j] += 1

Когда мне написали counts=defaultdict(int), он работал нормально.

Когда я изменил его на counts=defaultdict(Counter), он показал AttributeError: 'int 'У объекта нет атрибута' items '.

Когда я изменил его на counts=defaultdict(lambda : defaultdict(int)), он показал TypeError: неподдерживаемые типы операндов для + =:' collection.defaultdict 'и' int '.

Может кто-нибудь объяснить, что происходит, и в этом случае мы должны использовать Counter или Int или Lambda. Что я понял, так это то, что когда мы создаем defaultdict (int), он по умолчанию предоставляет значение по умолчанию 0. Но я не понял, почему я получил ошибку в случае использования Counter.

PS - я ссылался на эту ссылку, но до сих пор не поняли. смешивание defaultdict (dict и int)

1 Ответ

0 голосов
/ 15 апреля 2020

defaultdict(int) практически эквивалентно Counter здесь, поэтому я собираюсь игнорировать defaultdict(int) для экономии места.

Counter создает плоскую структуру данных, такую ​​как {foo: 0}, которая не не работает с вашим вложенным диктом.

defaultdict(Counter) создает структуру вложенных данных, такую ​​как {foo: {bar: 0}}, которая не работает с вашим плоским диктатом.

...