Рубрики
Без рубрики

Индекс списка Python () – простое иллюстрированное руководство

В этом руководстве показано вам все, что вам нужно знать, чтобы помочь вам овладеть основным индексом () методом наиболее фундаментального типа данных контейнера в языке программирования Python. https://youtu.be/a-j5ngl4mzc Определение и использование: метод list.index (value) Возвращает индекс аргумента Value в списке. Вы можете использовать необязательные аргументы начать и остановить аргументы … Python List Idex () – простая иллюстрированная руководство Подробнее »

Автор оригинала: Chris.

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

Определение и использование: list.index (значение) Метод возвращает индекс ценность Аргумент в Список Отказ Вы можете использовать дополнительные Начать и Стоп Аргументы для ограничения диапазона индекса, где искать значение в списке. Если значение не в списке, метод бросает ValueError Отказ

Вот краткий пример:

>>> lst = ["Alice", 42, "Bob", 99]
>>> lst.index("Alice")
0
>>> lst.index(99)
3
>>> lst.index(99, 1, 3)      
Traceback (most recent call last):
  File "", line 1, in 
    lst.index(99, 1, 3)
ValueError: 99 is not in list

В первой строке примера вы создаете список lst Отказ Затем вы посмотрите на индекс элементов "Алиса" и 99 Отказ Если вы используете Start = 1 и Стоп = 3 , значение 99 больше не найден, а Python бросает ValueError Отказ

Код головоломки – попробуйте сами:

Теперь вы знаете основы. Давайте углубим ваше понимание с коротким кодом головоломки – можешь решить это?

# Create a list of customers
customers = ['Alice', 'Bob', 'Frank', 'Ann']

# Extract all names of customers starting with 'A'
indices_of_A = [customers.index(x) for x in customers if x[0] == 'A']

# Print the resulting customers
print(list(customers[i] for i in indices_of_A))

# What's the output of this puzzle?

Вы также можете решить эту головоломку и отслеживать свои навыки Python на нашем интерактивном приложении Finxter.

Синтаксис : Вы можете вызвать этот метод на каждом объекте списка в Python ( Python Versions 2.x и 3.x ). Вот синтаксис:

list.index (значение ,,)

Аргументы:

стоимость Возвращает индекс значения в списке. В списке появляется значение, если оператор == возвращает true. Если значение не существует в списке, возвращаемое значение равно -1.
Начало (Необязательно.) Индекс того, где вы хотите начать поиск в списке. Все элементы списка перед этой позицией игнорируются. Это позиционный аргумент, а не аргумент ключевых слов.
останавливаться (Необязательно.) Индекс того, где вы хотите перестать поиск в списке. Все элементы списка после этой позиции игнорируются. Это позиционный аргумент, а не аргумент ключевых слов.

Возвращаемое значение: Метод list.index (значение) Возвращает целочисленное значение, представляющее индекс, где аргумент ценность появляется в списке. Если значение не отображается в списке, метод бросает ValueError Отказ

Статьи по Теме:

  • Python Regex SuperPower – Ultimate Guide
  • Python перечислены сверхдержавы (28 000 слов + видео)

Вот ваш бесплатный PDF чит-лист, показывающий вас все методы списка Python на одной простой странице. Нажмите на изображение, чтобы загрузить файл PDF с высоким разрешением, распечатать его и опубликовать его в свою офисную стену:

Реализация индекса списка Python

Так что вы действительно хотите знать Cpython Реализация Индекс () метод?

На высоком уровне алгоритм, чтобы найти индекс заданного значения в списке состоит из следующих шагов:

  • Убедитесь, что начальные и стоп-индексы не менее нуля.
  • Итайте для всех элементов в списке и проверьте, будут ли они равны.
  • Если они равны, вернитесь немедленно из способа.
  • Если ни один элемент не найден, бросьте ValueError Отказ

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

/*[clinic input]
list.index
    value: object
    start: slice_index(accept={int}) = 0
    stop: slice_index(accept={int}, c_default="PY_SSIZE_T_MAX") = sys.maxsize
    /
Return first index of value.
Raises ValueError if the value is not present.
[clinic start generated code]*/

static PyObject *
list_index_impl(PyListObject *self, PyObject *value, Py_ssize_t start,
                Py_ssize_t stop)
/*[clinic end generated code: output=ec51b88787e4e481 input=40ec5826303a0eb1]*/
{
    Py_ssize_t i;

    if (start < 0) {
        start += Py_SIZE(self);
        if (start < 0)
            start = 0;
    }
    if (stop < 0) {
        stop += Py_SIZE(self);
        if (stop < 0)
            stop = 0;
    }
    for (i = start; i < stop && i < Py_SIZE(self); i++) {
        PyObject *obj = self->ob_item[i];
        Py_INCREF(obj);
        int cmp = PyObject_RichCompareBool(obj, value, Py_EQ);
        Py_DECREF(obj);
        if (cmp > 0)
            return PyLong_FromSsize_t(i);
        else if (cmp < 0)
            return NULL;
    }
    PyErr_Format(PyExc_ValueError, "%R is not in list", value);
    return NULL;
}

Но какова вычислительная сложность этого Индекс () Метод в Python?

Сложность указателя списка Python

Для простоты вот питон эквивалентен реализации с некоторыми основными упрощениями, которые не изменяют общую сложность:

def index(value, lst):
    for i, el in enumerate(lst):
        if el==value:
            return i
    raise Exception('ValueError')

print(index(42, [1, 2, 42, 99]))
# 2

print(index("Alice", [1, 2, 3]))
'''
Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 10, in 
    print(index("Alice", [1, 2, 3]))
  File "C:\Users\xcent\Desktop\code.py", line 5, in index
    raise Exception('ValueError')
Exception: ValueError
'''

Я знаю, что это не идеальная репликация вышеуказанного кода C ++. Но этого достаточно, чтобы увидеть вычислительное (выполнение) сложность list.index (значение) метод.

Индекс () Метод имеет линейную сложность выполнения в количестве элементов списка. Для N Элементы, сложность времени выполнения – O (n) Потому что в худшем случае вам нужно повторить каждый элемент в списке, чтобы найти, что элемент не появляется в нем.

Давайте проверим сложность выполнения практически для разных размеров списка с краткосрочной программой.

Вы можете увидеть участок времени сложности Индекс () Метод растущего размера списка здесь:

На рисунке показано, как прошедшее время нахождения элемента последнего списка в списке. Этот эксперимент повторяется для растущего количества элементов. Время выполнения растет линейным до количества элементов.

Если вы заинтересованы в коде, я использовал для генерации этого участка MATPLOTLIB, это он:

import matplotlib.pyplot as plt
import time

y = []
for i in [100000 * j for j in range(10,100)]:
    lst = list(range(i))
    t0 = time.time()
    x = lst.count(-99)
    t1 = time.time()
    y.append(t1-t0)


plt.plot(y)
plt.xlabel("List elements (10**5)")
plt.ylabel("Time (sec)")
plt.show()

Статьи по Теме:

  • Методы списка Python – простой обзор
  • Как начать изучать Python?

Индекс списка Python без исключения

По умолчанию, list.index () Метод будет бросать ValueError Если значение не равно элементу Список Отказ Когда я впервые столкнулся с методом list.index (), я предположил, что возвращаемое значение будет просто -1, поэтому я был удивлен, что метод бросил ошибку. Однако, подумав о проблеме, я пришел к выводу, что он имеет большой смысл не возвращать значение -1, если индекс не найден. Причина в том, что по Конвенции индекс -1 относится к последнему элементу в списке в Python:

>>> lst = [1, 2, 3]
>>> lst[-1]
3

Но что, если вы не хотите получить исключение, если значение не может быть найдено?

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

>>> ind = lambda l, v: [i for i in range(len(l)) if l[i] == v]
>>> ind('Alice', ['Bob', 'Alice', 'Frank'])
[]
>>> ind(['Bob', 'Alice', 'Frank'], 'Alice')
[1]

Функция Инд Находит все вхождения данного значения в данном списке в линейной среде выполнения, не бросая ошибку. Вместо этого он просто вернет пустой список.

Статьи по Теме

Индекс списка Python попробуйте поймать

Python list.index (значение) Метод бросает ValueError Если значение не в списке. Если вы ничего не делаете об этом, это может нарушить всю вашу программу. Так что вы можете сделать с этим?

Питонический способ – это «поймать» исключение в блоке попробовать/ловить. Затем вы можете обрабатывать его в блоке Catch, который выполняется только в том случае, если значение не в списке. (Вам нужен план резервного копирования в любом случае.)

Вот как вы можете поймать ValueError В минимальном фрагменте кода:

lst = [1, 2, 3]

try:
    index = lst.index('Alice')
except ValueError:
   index = None

print(index)
# None

Вывод ожидается:

None 

Вы даже не видите, что произошло исключение при выполнении кода.

Однако, если это, кажется, давно обнародован для вас (и вы любите Python One-Listers так же, как и я, вы должны сделать следующее:

Во-первых, проверьте мою новую книгу Python One-listers Это научит вас понять каждую одну линейку кода, который вы когда-либо сталкиваетесь на практике.

Во-вторых, используйте одноклассницу для достижения того же:

lst = [1, 2, 3]

indices = [i for i in range(len(lst)) if lst[i]=='Alice']
index = indices[0] if indices else None
print(index)

Это мой предпочтительный вариант.

Индекс списка Python вне диапазона

Это сообщение об ошибке появляется, если вы пытаетесь получить доступ к элементам списка с индексом, который больше, чем максимальный допустимый индекс или меньше, чем Отрицательная индексация -Лен (список) Отказ

Вот минимальный пример обоих случаев:

>>> lst = [1, 2, 3]
>>> lst[3]
Traceback (most recent call last):
  File "", line 1, in 
    lst[3]
IndexError: list index out of range
>>> lst[-5]
Traceback (most recent call last):
  File "", line 1, in 
    lst[-5]
IndexError: list index out of range

Чтобы избежать IndexError, просто используйте индексы в пределах допустимого диапазона (инклюзивных чисел) между -Лен (список) и + Лен (список) -1 Отказ

Вот как эта ошибка может появиться при удалении элементов из списка во время итерации по нему:

l=[3, 3, 3, 4, 4, 4]
for i in range(0,len(l)):
    l.pop(i)

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 3, in 
    l.pop(i)
IndexError: pop index out of range

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

Индекс списка Python несколько

Чтобы найти несколько элементов элемента в списке, вы можете использовать Индекс () Метод несколько раз, установив индекс запуска к ранее найденному индексу.

lst = [1, 2, 3, 3, 3, 3, 3, 3, 0, 0, 0]
value = 3
min_index = 0
indices = []

while min_index < len(lst):
    try:
        indices.append(lst.index(value, min_index))
        min_index = indices[-1] + 1
    except ValueError:
        min_index = len(lst)

print(indices)
# [2, 3, 4, 5, 6, 7]

Но я бы не советую это, как это сложно и трудно читать. Простой одноклассник это все, что тебе нужно:

indices = [i for i in range(len(lst)) if lst[i] == value]
print(indices)
# [2, 3, 4, 5, 6, 7]

Красивая лучше сложное!

Индекс списка Python Max/Min

Дано это список:

a = [33, 11, 23, 55, 89, 101, 1, 101, 33, 83, 101]

Максимальный элемент в списке составляет 101.

Проблема : Найти все индексные позиции (ы) максимума в списке.

Решение: используйте следующее краткое решение, чтобы получить список максимальных позиций.

a = [33, 11, 23, 55, 89, 101, 1, 101, 33, 83, 101]
maxs = [i for i in range(len(a)) if a[i] == max(a)]
print(maxs)
# [5, 7, 10]

В фрагменте кода вы используете Понимание списка Чтобы получить все показатели максимального элемента Макс (а) Отказ

Конечно, если вы заботитесь о производительности, вы также можете оптимизировать это путем расчета Макс (а) один раз, храните его в переменной Max_a и используя переменную вместо расчета его снова и снова.

a = [33, 11, 23, 55, 89, 101, 1, 101, 33, 83, 101]
max_a = max(a)
maxs = [i for i in range(len(a)) if a[i] == max_a]
print(maxs)
# [5, 7, 10]

Вы можете легко сделать то же самое для индексов минимальных элементов в списке, используя мин (а), а не MAX (A):

a = [33, 11, 23, 55, 89, 101, 1, 101, 33, 83, 101]
min_a = min(a)
mins = [i for i in range(len(a)) if a[i] == min_a]
print(mins)
# [6]

Индекс списка Python с конца (обратный)

Вы можете рассчитать индекс с конца, используя перевернутый список (я использовал нарезку lst [:: - 1] с отрицательным размером шага, чтобы изменить список).

Скажите, вы список элементов. Вы ищете значение 101. По умолчанию метод list.index (value) просматривает слева и возвращает левый элемент, который равна значению. Но что, если вы хотите сделать это справа?

Вот как: вы рассчитываете индекс (по отношению к исходному списку), как это: index_right (a) - A [:: - 1] .index (101) - 1 Отказ

a = [23, 55, 89, 101, 1, 101, 33, 83]

index_left = a.index(101)
index_right =  len(a) - a[::-1].index(101) - 1

print(index_left)
# 3

print(index_right)
# 5

Просто подумайте об этом на мгновение. Если вы просто поменяете список списка и найдите первое возникновение значения, вы получите неправильный индекс в отношении исходного списка. (Вы получите его назад.) Итак, сначала сначала необходимо поменять схему индексации, как сделано в коде.

Индекс списка Python Regex/Wildcard

Как вы можете найти индекс элементов в списке, который соответствует определенному Regex?

Связанная статья:

  • Python Regex SuperPower: полный учебник

Ответ : Вы делаете это с коротким Понимание списка Заявление (нет встроенного метода, и это достаточно просто).

import re

lst = ['Alice', 'Bob', 'Ann', 'Albrecht']
pattern = 'A.*'

matching_indices = [i for i in range(len(lst)) if re.match(pattern, lst[i])]
print(matching_indices)
# [0, 2, 3]

Re.match (шаблон, lst [i]) Метод возвращает соответствующий объект, если шаблон соответствует элементу в положении I в списке. В этом случае вы добавляете его в список результатов.

Индекс списка Python Cuple

Как найти индекс кортежа в списке кортежей?

Используйте list.index (значение) Способ, который возвращает индекс первого возникновения значения в списке. Это также работает для кортежей:

>>> [(1, 1), (2, 2), (3, 3)].index((3,3))
2

Индекс списка Python True False

Как найти все показатели Правда Значения в списке кортежей?

Использование списка понимание со встроенным перечислять () Функция для итерации по всему (индекс, стоимость) пары. Вот минимальный пример:

lst = [True, True, True, False, False, True]
print([i for i, x in enumerate(lst) if x])
# [0, 1, 2, 5]

Вы можете сделать то же самое, но проверьте на не х Чтобы найти все показатели Ложь Значения в списке:

lst = [True, True, True, False, False, True]
print([i for i, x in enumerate(lst) if not x])
# [3, 4]

Индекс списка Python ноль/ненулевой

Как найти индексы всех нулевых элементов в списке?

Использование списка понимание со встроенным перечислять () Функция для итерации по всему (индекс, стоимость) пары. Вот минимальный пример:

lst = [0, 0, 0, 1, 1, 1, 0, 1]
print([i for i, x in enumerate(lst) if not x])
# [0, 1, 2, 6]

Вы можете найти все ненулевые элементы, пропустив отрицание в состоянии понимания списка:

lst = [0, 0, 0, 1, 1, 1, 0, 1]
print([i for i, x in enumerate(lst) if x])
# [3, 4, 5, 7]

Python List Index Pop

list.pop (индекс) Способ с дополнительным индексом аргумента удаляет и возвращает элемент в индексе позиции.

Связанная статья:

  • Список Python POP ()

Пример выглядит следующим образом:

>>> lst = [1, 2, 3]
>>> lst.pop()
3
>>> lst
[1, 2]

В первой строке примера вы создаете список lst Отказ Затем вы удалите и возвращаете окончательный элемент 3 из списка. Результатом является список только с двумя элементами [1, 2] Отказ

Удалить индекс списка Python

Этот трюк также относительно неизвестен среди начинающих Python:

  • Использовать del lst [индекс] Чтобы удалить элемент при индексе.
  • Использовать del lst [start: Stop] Чтобы удалить все элементы в ломтик Отказ
>>> lst = list(range(10))
>>> lst
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del lst[5]
>>> lst
[0, 1, 2, 3, 4, 6, 7, 8, 9]
>>> del lst[:4]
>>> lst
[4, 6, 7, 8, 9]

Диапазон индекса списка Python

Если вы ищете диапазон индекса, вы, вероятно, значения нарезка Какая передовая техника вытекает ряд значений из списка или строки Python. Смотрите полный учебник нарезки на блог Finxter здесь.

Обозначение это Список [Старт: Стоп: Шаг] Отказ Аргумент шага является необязательным, и вам не нужно, чтобы вырезать диапазон значений.

Вот некоторые примеры:

>>> lst = ['a', 'b', 'c', 'd', 'e']
>>> lst[:]
['a', 'b', 'c', 'd', 'e']
>>> lst[2:4]
['c', 'd']
>>> lst[3:]
['d', 'e']
>>> lst[:-3]
['a', 'b']
>>> lst[:-1]
['a', 'b', 'c', 'd']
>>> lst[::2]
['a', 'c', 'e']

Индекс списка Python в 2D списках

Скажем, вы хотите найти индекс ряд и столбцов значения 5 в массиве

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

Вы можете просто рассчитать координаты X и Y, как это:

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

row = [x for x in a if 5 in x][0]
x = a.index(row)
y = row.index(5)
print(x, y)
# 2 0

Индекс списка Python () Безопасный

У вас есть несколько потоков, которые одновременно получают доступ к вашему списку? Затем вы должны быть уверены, что операции списка (например, index () ) на самом деле резьба безопасна Отказ

Другими словами: вы можете позвонить в индекс () Операция в двух потоках в том же списке одновременно? (И вы можете быть уверены, что результат является значимым?)

Ответ да (если вы используете Mokef Cpython внедрение). Причина – Питона Блокировка глобального интерпретатора Это гарантирует, что в настоящее время поток работает над своим кодом, сначала завершит текущую базовую операцию Python, как определено реализацией Cpython. Только если оно завершится с помощью этой операции, сможет получить следующий поток для доступа к вычислительному ресурсу. Это обеспечивается сложной схемой блокировки в результате реализации CPYPHON.

Единственное, что вам нужно знать, состоит в том, что каждая основная операция в реализации CPYPHON является атомный Отказ Он выполнен полностью и сразу, прежде чем любой другой поток имеет возможность запустить на одном виртуальном двигателе. Поэтому нет условий расы. Примером такого состояния гонки будет следующим: Первый поток считывает значение из списка, второй поток перезаписывает значение, и первая тема перезаписывает значение снова недействительным в операции второго потока.

Все операции Cpython являются потоковыми безопасными. Но если вы объединяете эти операции на функции более высокого уровня, это не в целом без резьбы, поскольку они состоят из многих (возможно, чередующихся) операций.

Куда пойти отсюда?

list.index (значение) Способ находит индекс первого возникновения элемента ценность В Список Отказ Вы узнали IS и ауты этого важного Метод списка Python Отказ

Если вы продолжаете бороться с теми основными командами Python, и вы чувствуете застрявшие в своем прогрессе обучения, у меня есть что-то для вас: Python One-listers (Amazon Link).

В книге я дам вам тщательный обзор темы критических компьютерных наук, таких как машинное обучение, регулярное выражение, наука о данных, Numpy и Python Basics – все в одной линейке кода Python!

Получите книгу от Amazon!

Официальная книга Описание: Python One-Listers покажет читателям, как выполнить полезные задачи с одной строкой кода Python. Следуя краткому переподготовку Python, книга охватывает важные продвинутые темы, такие как нарезка, понимание списка, вещание, функции лямбда, алгоритмы, регулярные выражения, нейронные сети, логистические регрессии и др .. Каждая из 50 секций книг вводит проблему для решения, проходит читателя через навыки, необходимые для решения этой проблемы, затем предоставляет краткое однонаправленное решение Python с подробным объяснением.

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

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