groupby
Это функция groupby
из модуля itertools
, задокументированная здесь .data
«группируется» по результатам применения itemgetter(0)
(экземпляр класса itemgetter
из модуля operator
, задокументированный здесь ) к каждому элементу.Он возвращает пары (ключевой результат, итератор над элементами с этим ключом).Таким образом, каждый раз в цикле current_word
является «словом», общим для группы data
строк (индекс-0, то есть первый элемент, извлеченный с помощью itemgetter
), а group
- этоитератор над строками data
, которые начинаются с этого word
.Как описано в документации к вашему коду, в каждой строке файла есть два слова: фактическое «слово» и количество (текст, предназначенный для интерпретации как числа)
сумма (int (количество)) для current_word, количество в группе)
То, что означает именно то, что написано : сумма целочисленных значений count
, для каждого (current_word
, count
) пара найдена в group
.Каждый group
представляет собой набор строк из data
, как описано выше.Итак, мы берем все строки, которые начинаются с current_word
, преобразуем их строковые значения count
в целые числа и складываем их.
Как изменить этот чанк, чтобы он в основном продолжал делать то, чтоэто делает прямо сейчас, но со вторым значением счетчика?Т.е. ввод (word, count1, count2) и вывод (word, count1, count2).
Хорошо, что вы хотите, чтобы каждый счет представлял, и куда вы хотите, чтобы данные приходилис?
Я возьму то, что я считаю самой простой интерпретацией: вы собираетесь изменить файл данных так, чтобы в каждой строке было три элемента, исобирать суммы из каждого столбца чисел отдельно.
groupby
будет таким же, потому что мы по-прежнему группируем строки, которые получаем одинаково, и мы по-прежнему группируем их в соответствии с«слово».
Для части sum
потребуется вычислить два значения: сумму для первого столбца чисел и сумму для второго столбца чисел.
Когда мы выполняем итерациюсвыше group
мы получим наборы из трех значений, поэтому мы хотим распаковать их в три значения: например, current_word, group_a, group_b
.Для каждого из них мы хотим применить целочисленное преобразование к обоим числам в каждой строке.Это дает нам последовательность пар чисел;если мы хотим добавить все первые числа и все вторые числа, то вместо этого мы должны создать пару последовательностей чисел.Для этого мы можем использовать другую функцию itertools
с именем izip
.Затем мы можем суммировать каждый из них по отдельности, снова распаковывая их в две отдельные переменные последовательности чисел и суммируя их.
Таким образом:
counts_a, counts_b = izip(
(int(count_a), int(count_b)) for current_word, count_a, count_b in group
)
total_a, total_b = sum(counts_a), sum(counts_b)
Или мы могли бы просто сделатьпара подсчетов, выполнив тот же (x для y в z) трюк снова:
totals = (
sum(counts)
for counts in izip(
(int(count_a), int(count_b)) for current_word, count_a, count_b in group
)
)
Хотя этот результат будет несколько сложнее использовать в операторе print:)