- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
from itertools import groupby
In [31]: [list(g) for k, g in groupby('AAAABBBCCDAABBB')]
Out[31]:
[['A', 'A', 'A', 'A'],
['B', 'B', 'B'],
['C', 'C'],
['D'],
['A', 'A'],
['B', 'B', 'B']]
In [30]: [list(g) for k, g in list(groupby('AAAABBBCCDAABBB'))]
Out[30]: [[], ['B'], [], [], [], []]
Где ты берёшь эти фразы? Неужели гугль транслейт такое выдаёт? Ob здесь неуместен.
Вопросительное предложение звучит так:
Bist du Dolmetscher?
Ob нужен, когда нужно выразить неуверенность (не условие) в подчинённом предложении:
Ich weiß nicht, ob er Dolmetscher ist.
Du muss dich endlich entscheiden, ob du Dolmetscher oder Übersetzer werden willst.
https://ideone.com/52h3kj
Кмк, дело не в этом. Дело в том, что groupby ленивый, ему не нужно иметь весь датасет в памяти, чтобы сделать группировку. Если ты заранее знаешь, что датасет правильно отсортирован (генератор, который ты суёшь в groupby это гарантирует, или ты читаешь данные из большого файла на диске, где записи отсортированы по твоему ключу), то вся группировка будет ленивой в константном объёме памяти. Если заставить groupby делать сортировку самостоятельно, он потеряет это свойство, и ему уже не место в itertools.
Авторы библиотеки разумно предположили, что пользователю не сильно сложно вызвать .sorted(), если его устраивает идея держать весь датасет в памяти.
Какая именно часть слова itertools тебе не понятна? Это набор утилит, которые делают не более одного прохода по данным.
У нас, к примеру, весь дата-процессинг построен на ленивых коллекциях. Да даже если всего пару гигабайт обработать надо, ленивость будет большим плюсом.
> В случае сортировки это еще можно обхъяснить, если нужны первые N элементов.
Эта не совсем та ленивость, такая сортировка всё равно должна материализовать весь входной набор.
1. генереция списка функцией range.
2. map генерирует из него другой списк.
третье питно: range и map возвращают негереторы, здеся 1 суслик:
list дергает в кикле хуй next y map, тот в свою очередь дёргает next y range.
Вот этим хуйцам не нужно загружать весь файл в паметь: они оброботоют построчно файл любого розмера и запишут в построчно в другой файл, лишь бы хватило памета на одну сроку.
З.Ы. Как-то хотел по-быстрому J'ем оброботать один большой файл, так этому хуесосу не хватило помёта, потому что он считывает весь файл в паметь, а питончик хоть и медленно, но скушал всё говно. т.к. в нём функции map и range возвращали списки, в этой строчке спрятано как минимум 2 цикла:
Ну вот у меня была задача: взять пятигигабайтный файл, представляющий из себя зожатый XML, содержащий информацию о компаниях, и сделать случайную выборку этих компаний по регионам. Во-первых, память сервера можно использовать более рационально, чем грузить в неё гигабайты xml-я, во-вторых, типичной одноразовой программе на питоне требуется пара десятков итераций, прежде чем в ней не останется ошибок типов. Я не хочу ждать полчаса, пока весь файл запарсится в память, чтобы увидеть KeyError, вызванный ошибкой типов.
Я бы порекомендовал посмотреть https://www.youtube.com/watch?v=kGa78HQv_LQ, но ты ведь всё равно не будешь.
> питон способен за адекватное время обработать что-то не влазящее в память?
Если он используется как клей для сишных библиотек, то да.