Обновление списков Python

Обновление списков Python

Вступление

Списки Python хороши. Но они не велики. Существует так много функциональных возможностей, которые могут быть легко добавлены к ним, но все еще отсутствуют. Индексирование с логическими значениями, простое создание из них словарей, добавление более одного элемента за раз, и так далее, и так далее. Ну, не больше.

Fastai разработал собственную структуру данных под названием L. Цель этой статьи — показать вам, как легко написать такие полезные функции самостоятельно. Особенно, если вы новичок, попробуйте создать мини-версию этой библиотеки. Попробуйте написать некоторые из функций, которые, как вы надеялись, существовали. Это будет хороший опыт обучения.

Что такое L?

Как мы уже упоминали ранее, он похож на список Python, но его возможности намного больше. Давайте начнем с импорта библиотеки и создания экземпляра L.

from fastai2.imports import *
a = L([1,2,3])
a
[1,2,3]

Мы видим, что он печатает длину списка, а затем содержимое. Больше не нужно печатать длину отдельно. Также вы можете добавлять только один элемент за раз.

a += [4,5,6]
a
[1,2,3,4,5,6]

Обратите внимание, что эти вещи очень легко кодировать. Мы только определяем магический метод __add__, чтобы решить, что будет делать оператор +.
Давайте исследуем метод __add__.

def __mul__ (a,b): return a._new(a.items*b)
    def __add__ (a,b): return a._new(a.items+_listify(b))
    def __radd__(a,b): return a._new(b)+a
    def __addi__(a,b):
        a.items += list(b)
        return a

Он создает новый экземпляр L с текущими элементами и новыми элементами. Довольно просто, правда?
Давайте попробуем и mul.

a * 2
[1,2,3,4,5,6,1,2,3,4...]

Он повторяет список 2 раза. Также обратите внимание, что он печатает только первые 10 элементов, а затем отображает… Это намного чище, чем списки Python, которые отображают все элементы.
Вы можете найти уникальные элементы в L.

a.unique()
[1,2,3,4,5,6]

Вы можете легко преобразовать его в словарь.

names = L('dipam', 'ramu', 'adi', 'amba')
names.val2idx()
{'adi': 2, 'amba': 3, 'dipam': 0, 'ramu': 1}

Тем не менее, реальные перспективы L заключаются в его возможностях индексирования.

1) Индексация со списком индексов

a = L(range(20))
a[3,7,11]
[3,7,11]

2) Индексирование с логическими значениями

a[[True] + [False] * 5 + [True] * 3]
[0,6,7,8]

3) Многократное назначение

a[0,1,2] = L(100,101,102)
a
[100,101,102,3,4,5,6,7,8,9...]

Заключение

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *