Использование итератора для нарезки массива - PullRequest
0 голосов
/ 23 сентября 2019

Я искал этот код на python, который мне нужно объяснить:

arr = [0, 0, 0, 0, 1, 2, 3, 4,5]
arr = arr[next((i for i, x in enumerate(arr) if x != 0), len(arr)):]

Этот код удалит начальные нули из массива, я пытаюсь понять, как он работает.Я понимаю, что мы создали итератор, который будет перебирать все элементы arr, но 0 значений, а следующий будет перебирать только до длины массива (не включительно).

Но как эти индексы возвращаются следующим,объединить в массив?

1 Ответ

1 голос
/ 23 сентября 2019

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

arr = arr[n:]

Это в основном то, что мы имеем здесь, с n = next((i for i, x in enumerate(arr) if x != 0), len(arr)).

InВообще, форма с двумя аргументами next будет возвращать второй аргумент в качестве маркера, а не поднимать StopIteration, если итератор закончится.Вот для чего len(arr).Если все элементы равны нулю, выражение становится

arr = arr[len(arr):]  # obviously empty

Если есть ненулевой элемент, вызов next найдет его индекс (включенный с помощью enumerate) и вернет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...