Питон, как использовать карту (), чтобы разделить список на подсписки?

У меня есть эта функция, чтобы разделить iterables на подсписки длиной, заполнить ценностями, и направление заполняется:

def split(v,size,fill=0,direction='right'):
    if size == 0: return []
    lenv = len(v)
    count = lenv/size
    remainder = lenv%size
    result = []
    for i in range(0,lenv-remainder,size):
            result.append(v[i:i+size])
    if remainder > 0:
            if direction == 'right':
                    result.append(v[count*size:] + [fill] * (size-remainder))
            else:
                    result.append([fill] * (size-remainder) + v[count*size:])
    return result

Поскольку мне нравятся лайнеры, я хочу переписать его с картой, но я не понимаю как к. У меня есть это до сих пор:

def j1(a,b): 
        return a + b 

def j2(a,b): 
        return b 

def split2(v,size,fill=0): 
        map(j1,(x for x in map(j2,v))) 

Понятия не имею. Какие-либо намеки?

3
nl ja de

1 ответы

I believe you are thinking too much. This problem can be aptly handled using the grouper recipe without using map

def split1(v,size,fill=0,direction='right'):
    result = list(izip_longest(*[iter(l)]*size, fillvalue=fill))
    if direction == 'left':
        result[-1] = result[-1][::-1]
    return result

Объяснение:

  • iter: This function converts a sequence to an iterable. Iterables are self consumable and has only one method, next which returns the next element from the iterable, moving from left to right.
  • [iter(l)]*size: Creates a list of size iterables
  • * (Kleene star): This operator is used to unpack a list or tuple
  • izip_longest: Transposed the elements. For shorter sequences, it is filled by filled value
  • result[-1] = result[-1][::-1]: If the direction is left reverse the last sequence

Другое возможное популярное решение без морского окуня

def split2(v,size,fill=0,direction='right'):
    result = [v[i:i+size] for i in range(0,len(v),size)]
    result[-1] = result[-1] + [fill] * (size - len(result[-1]))
    if direction == 'left':
        result[-1] = result[-1][::-1]
    return result

Объяснение:

  • Used Python's Extended Slice. Sequence Slicing has the following syntax [start: end: stride]
  • Python Range returns a list (in Py2.x) and a range object (in Py 3.x) as a sequence/iterable , starting from start, ending at end and stepping stride elements. Similar to (for int i = start; i < stop; i+= stride)
  • [fill] * (size - len(result[-1])): Generates (size - len(result[-1])) fill elements as a list. If (size - len(result[-1])) is <=0 it generates an empty list
  • result[-1] = result[-1] + [fill] * (size - len(result[-1])) - Update the last sequence with the fill value
  • result[-1] = result[-1][::-1]: If the direction is left reverse the last sequence
6
добавлено
@CrisStringfellow: Ответ обновляется с объяснением
добавлено автор Abhijit, источник
Мне нравится этот, это кратко. Вы могли объяснить * распаковка немного?
добавлено автор Cris Stringfellow, источник
Потрясающий, спасибо.
добавлено автор Cris Stringfellow, источник
одной вещью, которую вы пропустили, было аннулирование, на самом деле полностью изменяет оригинальную последовательность списка, а также сторону, на которую заполнение применяются. Таким образом, я собираюсь отредактировать ваш ответ, чтобы включать намеченную функцию!
добавлено автор Cris Stringfellow, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community