1. Python / Говнокод #25066

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 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'], [], [], [], []]

    ЧЗХ?

    Запостил: syoma, 09 Ноября 2018

    Комментарии (39) RSS

    • Переведи на "PHP".
      Ответить
      • Он так не умеет.
        Ответить
      • <?php
        require 'itertools.php';
        
        foreach(groupby('AAAABBBCCDAABBB') as $k => $g) {
            var_dump($g);
        }

        Реализация функции "groupby" лежит в файле "itertools.php". Читателю предлагается придумать её самому в качестве домашнего задания.
        Ответить
        • P.S. groupby() is roughly equivalent to:
          class groupby:
              # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
              # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
              def __init__(self, iterable, key=None):
                  if key is None:
                      key = lambda x: x
                  self.keyfunc = key
                  self.it = iter(iterable)
                  self.tgtkey = self.currkey = self.currvalue = object()
              def __iter__(self):
                  return self
              def __next__(self):
                  self.id = object()
                  while self.currkey == self.tgtkey:
                      self.currvalue = next(self.it)    # Exit on StopIteration
                      self.currkey = self.keyfunc(self.currvalue)
                  self.tgtkey = self.currkey
                  return (self.currkey, self._grouper(self.tgtkey, self.id))
              def _grouper(self, tgtkey, id):
                  while self.id is id and self.currkey == tgtkey:
                      yield self.currvalue
                      try:
                          self.currvalue = next(self.it)
                      except StopIteration:
                          return
                      self.currkey = self.keyfunc(self.currvalue)

          Придётся переводить всю эту фигню.
          Ответить
        • Питушок, вы на курсах пхпшников не проходили что использование не должно быть привязано к реализации?
          Ответить
    • Сам сперва нихуя не понял, itertools.groupby возвращает итератор, который возвращает последовательность из (key, itertools._grouper), и, видимо, после вызова next предыдущий itertools._grouper уже недействителен. В первом случае ты по последовательности проходишся один раз, а во втором 2 (сперва list(groupby(sequence)), потом по получившемуся списку), и все, кроме последнего itertools._grouper не действительны. Вот только я не поняо откуда во втором элементе сриска ['B'].

      https://ideone.com/52h3kj
      Ответить
      • Ничего не понял. Как это выглядело бы в "PHP"?
        Ответить
      • >>Сам сперва нихуя не понял

        Котаны, ну вы пытались вообще доки читать?

        itertools.groupby(iterable[, key])
        Make an iterator that returns consecutive keys and groups from the iterable
        https://docs.python.org/2/library/itertools.html#itertools.groupby
        Ответить
        • Хули ты мне пишешь то, что я уже и так написал?
          Ответить
    • Такое впечатление, что grouper умирают после выхода из groupby. В документации как обычно нихуя.
      Ответить
    • Да и описание функции хуёвое. Оно похоже на uniq (для этого надо знать что это такое), т.е. группирует идущие рядом значения. Без сорта практически неюзабелен.
      Ответить
      • Поэтому я за "PHP".
        Ответить
      • Generally, the iterable needs to already be sorted on the same key function.

        даже написано
        Ответить
        • >Generally
          Что это значит?
          Ответить
          • https://translate.google.com/?hl=ru#en/uk/generally
            Ответить
            • Что значит в данном случае "в общем"?
              Ответить
              • Это слово-паразит: короче, в натуре, конкретно, без базара...

                Ну то есть в общем случае требуется сортировка. В каком-то конкретном случае может сработать и без сортировки, но мы никаких гарантий не давали.
                Ответить
                • >слово-паразит:
                  Я тоже так подумал.

                  А почему не сделать сортировку?
                  Ответить
                  • C-way: Царь должен сам отсортировать, потому что он лучше, чем библиотека, знает, какой должна быть сортировка.
                    Ответить
                    • > Царь должен сам отсортировать, потому что он лучше, чем библиотека, знает, какой должна быть сортировка.

                      Кмк, дело не в этом. Дело в том, что groupby ленивый, ему не нужно иметь весь датасет в памяти, чтобы сделать группировку. Если ты заранее знаешь, что датасет правильно отсортирован (генератор, который ты суёшь в groupby это гарантирует, или ты читаешь данные из большого файла на диске, где записи отсортированы по твоему ключу), то вся группировка будет ленивой в константном объёме памяти. Если заставить groupby делать сортировку самостоятельно, он потеряет это свойство, и ему уже не место в itertools.

                      Авторы библиотеки разумно предположили, что пользователю не сильно сложно вызвать .sorted(), если его устраивает идея держать весь датасет в памяти.
                      Ответить
                      • А смысл ленивости? Кому-то нужен неполный набор? В случае сортировки это еще можно обхъяснить, если нужны первые N элементов.
                        Ответить
                        • > А смысл ленивости?

                          Какая именно часть слова itertools тебе не понятна? Это набор утилит, которые делают не более одного прохода по данным.

                          У нас, к примеру, весь дата-процессинг построен на ленивых коллекциях. Да даже если всего пару гигабайт обработать надо, ленивость будет большим плюсом.

                          > В случае сортировки это еще можно обхъяснить, если нужны первые N элементов.

                          Эта не совсем та ленивость, такая сортировка всё равно должна материализовать весь входной набор.
                          Ответить
                          • http://govnokod.xyz/_25086/#comment-402417
                            Ответить
                          • Нахуя это нужно, хрюндель? Или питон способен за адекватное время обработать что-то не влазящее в память?
                            Ответить
                            • Возьмём старый засохгший кусок кода на python 2:
                              map(lambda x: x*x, range(10))
                              т.к. в нём функции map и range возвращали списки, в этой строчке спрятано как минимум 2 цикла:
                              1. генереция списка функцией range.
                              2. map генерирует из него другой списк.

                              третье питно:
                              list(map(lambda x: x*x, range(10)))
                              range и map возвращают негереторы, здеся 1 суслик:
                              list дергает в кикле хуй next y map, тот в свою очередь дёргает next y range.

                              Вот этим хуйцам не нужно загружать весь файл в паметь:
                              with open('in.txt', 'r') as in_f:
                                  with open('out.txt','w') as out_f:
                                      out_f.writelines(map(lambda x: ' '.join((str(x[0]), x[1])), enumerate(in_f)))
                              они оброботоют построчно файл любого розмера и запишут в построчно в другой файл, лишь бы хватило памета на одну сроку.

                              З.Ы. Как-то хотел по-быстрому J'ем оброботать один большой файл, так этому хуесосу не хватило помёта, потому что он считывает весь файл в паметь, а питончик хоть и медленно, но скушал всё говно.
                              Ответить
                              • На всякий случай переведу.

                                Возьмём старый засохший код на "PHP":
                                <?php array_map(function($x){return x*x;}, range(0,9,1));

                                Поскольку range развращает мосив, здеся будет как минимум два суслика:
                                1. Генереция мосива функцией range.
                                2. Генереция из него другого мосива функцией array_map.

                                Возьмём елду:
                                <?php function xrange($start, $limit, $step = 1) {
                                        for ($i = $start; $i <= $limit; $i += $step) {
                                            yield $i;
                                        }
                                }
                                
                                array_map(function($x){return x*x;}, xrange(0,9,1));

                                xrange развращает нигератор, поэтому здеся один суслик.
                                Ответить
                            • > Нахуя это нужно

                              Ну вот у меня была задача: взять пятигигабайтный файл, представляющий из себя зожатый XML, содержащий информацию о компаниях, и сделать случайную выборку этих компаний по регионам. Во-первых, память сервера можно использовать более рационально, чем грузить в неё гигабайты xml-я, во-вторых, типичной одноразовой программе на питоне требуется пара десятков итераций, прежде чем в ней не останется ошибок типов. Я не хочу ждать полчаса, пока весь файл запарсится в память, чтобы увидеть KeyError, вызванный ошибкой типов.

                              Я бы порекомендовал посмотреть https://www.youtube.com/watch?v=kGa78HQv_LQ, но ты ведь всё равно не будешь.

                              > питон способен за адекватное время обработать что-то не влазящее в память?

                              Если он используется как клей для сишных библиотек, то да.
                              Ответить
    • что непонятно? к каждому элементу применяется фя (если передана) и затем происходит группировка тоесть одинаковые элементы объединяются в группы

      как uniq в никсах

      массив должен быть сортирован конечно
      Ответить
    • Русня, у вас там совсем всё плохо? https://www.newsvl.ru/vlad/2018/11/15/175480/
      Ответить
      • Похоже на фейк. У нас даже несвежее дерьмо пытаются продать за деньги.
        Ответить
        • Не фейк
          Ответить
          • Ну не знаю... Обычно даже если три четверти какого-нибудь товара превратилось в гниль, его всё равно пытаются продать. А тут всего лишь "пожелтели".
            Ответить
      • А что плохого?
        Ответить

    Добавить комментарий