Как распечатать списки всех индексов в defaultdict в Python 3?

Я определил defaultdict следующим образом:

results=defaultdict(list)

В цикле for, который считывает каждую строку в моем файле словаря, я создаю tempWordObject, который содержит исходное слово (originalWord), его алфавитную версию (azWord) и длину слова (wLength). Затем я добавляю объект в список в зависимости от его длины:

results[tempWordObject.wLength].append(tempWordObject)

Итак, что я должен получить, так это defaultdict под названием results, в котором есть списки слов, основанные на их длине. Так, например, results[4] должен содержать все 4-буквенные слова в списке. Пожалуйста, поправьте меня, если я неправильно понимаю, что происходит.

То, что я пытаюсь сделать (в целях тестирования и для получения результатов позже), - это распечатать все списки, которые у меня есть в defaultdict, после того, как я закончу чтение файла. Таким образом, он будет печатать список словесных объектов defaultdict[1] в первой строке, список словесных объектов в defaultdict[2] во второй строке и т. д. Я также хотел бы иметь возможность печатать только определенный параметр, когда Я делаю это.

Если это поможет, у меня будет длина самого длинного слова (maxL) после завершения цикла.

Я думаю, что отчасти причина, по которой я не смог заставить это работать, связана с тем, что я неправильно понимаю, как всегда хранится в defaultdict и/или как я его храню. Объяснение будет высоко оценено.


person Michi    schedule 23.03.2014    source источник


Ответы (1)


Просто переберите ключи в отсортированном порядке:

for length in sorted(results):
    print length, [t.originalWord for t in results[length]]

defaultdict по-прежнему словарь; sorted(results) возвращает список всех ключей в этом словаре, отсортированный. Используя каждый ключ, вы можете снова получить доступ к сохраненным спискам ваших специальных объектов с помощью results[length]. Понимание списка просто извлекает каждый атрибут originalWord из этих объектов.

person Martijn Pieters    schedule 23.03.2014
comment
Поскольку defaultdict по-прежнему является сопоставлением, как и dict . - person Ignacio Vazquez-Abrams; 23.03.2014
comment
Моя основная проблема заключается в том, что он продолжает печатать так, например: 7 [объект __main__.word по адресу 0x01D86210›, объект ‹__main__.word по адресу 0x01D97450›, объект ‹__main__.word по адресу 0x01D974D0›, объект ‹__main__.word по адресу 0x01D97550 ›] - person Michi; 23.03.2014
comment
Затем повторите эти списки и получите к ним доступ соответствующим образом. - person Ignacio Vazquez-Abrams; 23.03.2014
comment
Извините, я не совсем понимаю, что вы имеете в виду под повторением списков. Не могли бы вы расширить это и/или привести пример? - person Michi; 23.03.2014
comment
@Michi: я добавил понимание списка, чтобы вы вытащили исходные слова для вас. - person Martijn Pieters; 23.03.2014
comment
@Martijn - спасибо! На самом деле мне не разрешено использовать встроенные функции сортировки, поэтому я сделал это, и, похоже, это сработало так же хорошо: для длины в результатах: печать (длина, [t.originalWord for t в результатах [длина]]) Однако, Я все еще немного запутался в синтаксисе. Где получается длина и что такое t в цикле? Я только начал изучать Python несколько дней назад, так что я очень новичок. - person Michi; 23.03.2014
comment
length — это просто имя, которое я выбрал для цели цикла for. Каждая итерация назначает ему следующую клавишу из results. То же самое для t в списке комп. Выбери для него любое имя, какое тебе нравится. - person Martijn Pieters; 23.03.2014
comment
@MartijnPieters и еще один вопрос. Когда я запустил его для своего фактического словаря (в отличие от тестового прогона), я заметил, что после того, как он напечатал список слов длиной 14, он пропустил 2 строки (слова не имеют длины 15/16) и перешел к 17 Однако этого не произошло между 23 и 45 (нет слов длиной от 23 до 44). Почему это происходит? - person Michi; 23.03.2014
comment
Вы имеете в виду, что он напечатал 15 [], а затем 16 []? Или 14 [word, word<2 blank lines>] потом 17 []? - person Martijn Pieters; 23.03.2014
comment
Пустые списки просто означают, что вы пытались увидеть, существует ли results[15] где-то еще в вашем коде или тестовом сеансе. Пробелы — это символы новой строки в ваших строках; убедитесь, что вы правильно удалили все пробелы при чтении из файла. - person Martijn Pieters; 23.03.2014
comment
Он оставляет пробелы только для строк 15 и 16. Однако он не создает пробелов между 23 и 45. Прямо сейчас он печатает 14 [список слов], новая строка, новая строка, 17 [список слов] ... 23 [список слов]. слова], 45 [список слов]. Итак, это непоследовательно. Все мои строки уже обработаны с помощью .strip('\r\n'. - person Michi; 23.03.2014
comment
Возможно, этот скриншот поможет понять, что я пытаюсь донести: i.imgur.com/rFzF6C5. png Вы хотите, чтобы я опубликовал свой код? - person Michi; 23.03.2014
comment
Я не знаю, чем это вызвано. Это может стать интересным новым вопросом. На этот вопрос был дан ответ; не публикуйте здесь свою новую загадку/загадку/интересную задачу. - person Martijn Pieters; 23.03.2014
comment
Я задал новый вопрос, но в процессе обнаружил, что это не пробелы. Предоставленный вами код просто пропускает все слова длиной 15 и 16 символов. - person Michi; 23.03.2014