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

    −1

    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
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    words = ['Broom', 'Being', 'Boring', 'Breeding', 'Dreaming', 'Doing', 'Dancing', 'Drinking',
         'Freezing', 'Falling', 'Flooding', 'Fearing', 'Saying', 'Sleeping', 'Standing',
         'Screaming', 'Running', 'Reading', 'Rolling', 'Rushing', 'Twerking', 'Telling']
    
    def make_rows(row_size: int) -> list:
        row_size = abs(int(row_size)); index = 0; amount = len(words)
        # Найти кол-во групп / Calculate the amount of sublists
        if row_size>amount: row_size=amount
        if row_size > 0:
            subs = (amount // row_size) + 1 if amount % row_size > 0 else amount // row_size
            print(f'Слов: {len(words)} | | Ячеек: {subs}\n')
            # Создать найденное кол-во групп / Create the found amount of sublists
            rows = [[] for i in range(subs)]
            for x in range(amount):
                rows[index].append(words[x])
                if len(rows[index]) == row_size: index += 1
            return rows
        else: return words
            
    print(make_rows(2))

    Запостил: rockkley94, 19 Октября 2022

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

    • Хм. Зачем x in range(amount), если можно сразу word in words?
      Упростил:
      def make_rows(row_size: int) -> list:
          amount = len(words)
          row_count = ((amount - 1) // row_size) + 1
      
          return [ words[ i * row_size : (i+1) * row_size] for i in range(row_count) ]

      Можно ещё 2-3 строки потратить на валидацию ввода, если хочется.
      Ответить
      • зачем массив когда есть линивый лист камприхежын
        Ответить
      • def make_rows(row_size: int) -> list:
            return [words[i:i+row_size] for i in range(0, len(words), row_size)]

        Или я чего-то не догоняю?
        Ответить
    • Сократил:
      import more_itertools
      
      
      def make_rows(row_size: int) -> list:
          return list(more_itertools.chunked(words, row_size))
      Ответить
      • Типы можно не указывать, так что ещё можно сократить.
        Ответить
      • Блять, как же режет глазах чтение скриптоговна, после долгого времени работы с низкоуровневщиной! И наоборот, тоже, кстати. Даже хуже.
        Ответить
      • Усложнил:
        def make_rows(row_size: int) -> list:
            return list(zip(*[iter(words)] * row_size)) + [(tuple(words[len(words) - (len(words) % row_size):]))]
        Хотел короче сделать, но оказывается зип откидывает оставшийся хвостик. Ну не пропадать же добру!
        Ответить
        • Можно зип_лонгест, но он пудет баддить огрызок чем-нибудь
          Ответить
      • Можно и импортозамещением:
        def make_chunks(lst: list, n: int):
        result = []
        for i in range(0, len(lst), n):
        res.append(lst[i:i + n])
        return result
        Ответить
        • Исправил типизацию:
          from typing import List, TypeVar
          
          
          _T = TypeVar('_T')
          
          
          def make_chunks(lst: List[_T], chunk_size: int) -> List[List[_T]]:
              result: List[List[_T]] = []
              for i in range(0, len(lst), chunk_size):
                  res.append(lst[i:i+n])
              return result
          Ответить

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