Поиск индекса по адресу. Мгновенно.
Казалось бы, динамика и инновации современного мира вытеснили его навсегда из обихода. Очевидно, что он стал ненужным. Совершенно. Многочисленные частные транспортные компании отменно справляются и без него с доставкой коробок, посылок, передач и писем. А он стал невидимой частью старинного порядка, о которой знают лишь немногие государственные служащие да муниципальные чиновники. Нет, его помнят ваши бабушки и дедушки наверняка! Узнали? Да, это он, почтовый индекс!
Почтовый индекс, или пару слов истории
В бывшем СССР найти индекс было несложно. Достаточно было прийти в почтовое отделение и воспользоваться огромным, весящим около 2-х кг, каталогом индексов. А еще проще было спросить определенный индекс у оператора или почтальона. Многие из этих последовательностей букв и цифр (на то время!) они помнили наизусть! Чем же стали тогда индексы России и соседних республик для миллионов жителей? Мощной уверенность в том, что письмо обязательно найдет адресата.
При этом быстро и легко!
Общение посредством письма в те годы было делом… обычным и привычным. А введение индекса в обиход позволило во много раз облегчить сортировку корреспонденции. Это облегчает ее и сейчас, когда этим заняты машины!
Пригодились индексы Москвы и других городов в прошлые годы, они нужны каждому и сейчас. Без индекса на почте не примут письмо, посылку или бандероль, не смогут оформить подписку на газету или журнал. Почтовые отделения предлагают десятки услуг, а индекс является неотъемлемой частью оформления документов.
Быстро и правильно, или почтовый индекс по адресу
Вы, как и ваши прабабушки, все также любите писать письма? Знаете, что отправление посылки стоит копейки по сравнению с нынешними ценами на услуги у частных компаний? Все платежи совершаете в почтовых отделениях и там же пользуетесь услугами банка? Тогда вы понимаете всю необходимость индекса!
Но, согласитесь, часты случаи, когда узнать индекс по адресу желательно заранее.
А что может быть лучше, чем приготовить посылку, бандероль или письмо дома, избавив себя от необходимости заполнять формы на территории почтового отделения? Дома, да еще в комфортных условиях узнать индекс по улице теперь возможно!
Теперь легко найти почтовый индекс по адресу с нашей помощью! Наш портал предоставляет такую возможность каждому, освободив вас от необходимости ранее выходить из дому с тем, чтобы узнать эту последовательность на почте. Легкая форма для заполнения попросит указать город, название улицы и дом. И вот, заветные цифры перед вами! Осталось только записать!
Интересный факт: тем организациям и частным лицам, которые получают огромные объемы корреспонденции, присваиваются индивидуальные индексы. Финский Йоулупукки, к примеру, равно как и канадский Санта Клаус, имеют собственные. Кстати, вы можете написать последнему. Он обязательно ответит! И не забудьте индекс — SANTA CLAUS!
Если Вы заметили на сайте опечатку или неточность, выделите её |
python — Как получить индекс строки, где находится значение?
Вопрос задан
Изменён 11 месяцев назад
Просмотрен 4k раз
У меня есть массив. Я хочу получить индекс строки, в котором находится искомое значение.
| Начало | Конец | Продолжительность | Сумма |
|---|---|---|---|
| 2020-01-01 | 2020-03-15 | 75 | -961.4 |
| 2020-03-16 | 2020-03-16 | 1 | 0.2 |
| 2020-03-17 | 2020-03-29 | 13 | -86.1 |
| 2020-03-30 | 2020-03-30 | 1 | 1. 0 |
| 2020-03-31 | 2020-04-01 | 2 | -6.8 |
| 2020-04-02 | 2020-10-06 | 188 | 2287.6 |
| 2020-10-07 | 2020-10-13 | 7 | -18.9 |
| 2020-10-14 | 2020-10-18 | 5 | 4.2 |
| 2020-10-19 | 2020-10-21 | 3 | -3.8 |
| 2020-10-22 | 2020-10-22 | 1 | 1.9 |
| 2020-10-23 | 2020-11-07 | 16 | -114.3 |
| 2020-11-08 | 2020-11-10 | 3 | 3.5 |
| 2020-11-11 | 2020-12-31 | 51 | -962.4 |
Я обращаюсь к таблице, чтобы вернуть значение индекса. Например хочу знать какой индекс имеет строка, где находить значение «Сумма» равное 2287.6. Оно должно мне возвращать 5.
ind = df[df['Сумма'] == 2287.6].index.values.astype(int)
Но мне возвращается просто пустой список: [].
В чем может быть проблема? Также, как можно получить значение из другой колонки, которое находится на этой же строке?
- python
- pandas
- dataframe
- обработка-данных
6
Вы можете сначала преобразовать столбцы к нужному типу данных, а потом делать поиск:
df["Сумма"] = pd.to_numeric(df["Сумма"], errors="coerce") idx = df[df['Сумма'] == 2287.6].index print(idx.to_list()) # [5]
получить значение по найденному индексу из другого столбца — возвращается объект типа pandas.Series:
In [89]: print(df.loc[idx, "Начало"]) 5 2020-04-02 Name: Начало, dtype: object
чтобы вернуть скалярное значение:
In [91]: print(df.at[idx[0], "Начало"]) # 2020-04-02
PS официальная документация об индексировании и доступе к данным в Pandas
Зарегистрируйтесь или войдите
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
python — поиск индекса элемента в списке
Поиск индекса элемента по списку, содержащему его в Python
Для списка
["foo", "bar", "baz"]и элемента в списке"bar", какой самый чистый способ получить его индекс (1) в Python?
Ну да, есть метод index, который возвращает индекс первого вхождения:
>>> l = ["foo", "bar", "baz"] >>> l.index('бар') 1
Есть несколько проблем с этим методом:
- если значение отсутствует в списке, вы получите
ValueError - если в списке присутствует более одного значения, вы получите индекс только для первого из них
Нет значений
Если значение может отсутствовать, необходимо отловить ValueError .
Вы можете сделать это с помощью многоразового определения, подобного этому:
def index(a_list, value): пытаться: вернуть a_list.index (значение) кроме ValueError: возврат Нет
И используйте это так:
>>> print(index(l, 'quux')) Никто >>> print(index(l, 'bar')) 1
И недостатком этого является то, что у вас, вероятно, будет проверка, является ли возвращаемое значение или не None:
result = index(a_list, value)
если результат не None:
сделать_что-то (результат)
Более одного значения в списке
Если бы у вас могло быть больше вхождений, вы бы не получили полную информацию с list. :
index
>>> l.append('bar')
>>> л
['фу', 'бар', 'баз', 'бар']
>>> l.index('bar') # ничего в индексе 3?
1
Вы можете перечислить индексы в виде списка:
>>> [индекс для индекса, v в enumerate(l), если v == 'bar'] [1, 3] > >> [индекс для индекса, v в enumerate(l), если v == 'boink'] []
Если у вас нет вхождений, вы можете проверить это с помощью логической проверки результата или просто ничего не делать, если вы перебираете результаты:
indexes = [индекс для индекса, v в enumerate(l), если v == 'boink']
для индекса в индексах:
делать_что-то (индекс)
Лучшая обработка данных с помощью pandas
Если у вас есть pandas, вы можете легко получить эту информацию с помощью объекта Series:
>>> import pandas as pd >>> серия = pd.Series(l) >>> серия 0 фу 1 бар 2 баз 3 бар тип: объект
Проверка сравнения вернет серию логических значений:
>>> series == 'bar' 0 Ложь 1 правда 2 Ложь 3 Правда тип: логический
Передайте эту серию логических значений в серию с помощью нижнего индекса, и вы получите только совпадающие элементы:
>>> series[series == 'bar'] 1 бар 3 бар тип: объект
Если вам нужны только индексы, атрибут index возвращает ряд целых чисел:
>>> series[series == 'bar'].index Int64Index([1, 3], dtype='int64')
И если вы хотите, чтобы они были в списке или кортеже, просто передайте их конструктору:
>>> list(series[series == 'bar'].index) [1, 3]
Да, вы могли бы использовать понимание списка с enumerate, но, на мой взгляд, это не так элегантно — вы выполняете тесты на равенство в Python, вместо того, чтобы позволить встроенному коду, написанному на C, обрабатывать это:
>> > [i для i, значение в enumerate(l), если значение == 'bar'] [1, 3]
Проблема XY спрашивает о вашей попытке решения, а не о вашей реальной проблеме.
Как вы думаете, зачем нужен индекс для элемента в списке?
Если вы уже знаете значение, какая вам разница, где оно находится в списке?
Если значения нет, перехват ValueError довольно многословен, и я предпочитаю этого избегать.
В любом случае я обычно перебираю список, поэтому я обычно сохраняю указатель на любую интересную информацию, получая индекс с перечислением.
Если вы обрабатываете данные, вам, вероятно, следует использовать pandas, у которого есть гораздо более элегантные инструменты, чем обходные пути на чистом Python, которые я показал.
Я не помню, чтобы мне самому понадобился list.index . Однако я просмотрел стандартную библиотеку Python и нашел для нее несколько отличных применений.
В idlelib для графического пользовательского интерфейса и разбора текста существует множество применений.
Модуль ключевого слова использует его для поиска маркеров комментариев в модуле, чтобы автоматически регенерировать список ключевых слов в нем посредством метапрограммирования.
В Lib/mailbox.py он, кажется, использует его как упорядоченное сопоставление:
key_list[key_list.index(старый)] = новый
и
del key_list[key_list.index(key)]
В Lib/http/cookiejar.py, кажется, используется для получения следующего месяца:
mon = MONTHS_LOWER.index(mon.lower())+1
В Lib/tarfile.py аналогично distutils для получения фрагмента до элемента:
members =members[:members.index(tarinfo)]
В Lib/pickletools.py:
numtopop = before.index(markobject)
Что общего у этих вариантов использования, так это то, что они работают со списками ограниченного размера (важно из-за O(n) времени поиска для list.index ), и они в основном используются при синтаксическом анализе (и пользовательском интерфейсе в случае бездействия).
Несмотря на то, что для него есть варианты использования, они довольно необычны. Если вы обнаружите, что ищете этот ответ, спросите себя, является ли то, что вы делаете, наиболее прямым использованием инструментов, предоставляемых языком, для вашего варианта использования.
python — Получение индекса возвращаемого максимального или минимального элемента с использованием max()/min() в списке
спросил
Изменено 2 месяца назад
Просмотрено 1,4 млн раз
Я использую функции Python max и min в списках для минимаксного алгоритма, и мне нужен индекс значения, возвращаемого max() или min() .
Другими словами, мне нужно знать, какой ход дал максимальное (на ходу первого игрока) или минимальное (второго игрока) значение.
для i в диапазоне (9):
new_board = current_board.new_board_with_move([i / 3, i % 3], игрок)
если новая_доска:
temp = min_max (новая_доска, глубина + 1, а не is_min_level)
значения.добавлять(темп)
если is_min_level:
вернуть минимум (значения)
еще:
вернуть максимум (значения)
Мне нужно иметь возможность вернуть фактический индекс минимального или максимального значения, а не только значение.
- питон
- список
- макс.
- мин.
1
Предположим, что у вас есть список из значений = [3,6,1,5] и вам нужен индекс наименьшего элемента, т. е. в данном случае index_min = 2 .
Избегайте решения с itemgetter() , представленного в других ответах, и используйте вместо него
index_min = min(range(len(values)), key=values.__getitem__)
, потому что не требуется импортировать оператор или использовать для перечисления , и это всегда быстрее (контрольный показатель ниже), чем решение с использованием элементгеттер() .
Если вы имеете дело с массивами numpy или можете позволить себе numpy в качестве зависимости, рассмотрите также возможность использования
import numpy as np index_min = np.argmin (значения)
Это будет быстрее, чем первое решение, даже если вы примените его к чистому списку Python, если:
- он больше, чем несколько элементов (около 2**4 элементов на моей машине)
- вы можете позволить себе копию памяти из чистого списка в массив
numpy
, как указывает этот тест:
Я выполнил тест на своей машине с Python 2.7 для двух решений выше (синий: чистый python, первое решение) (красный, решение numpy) и для стандартного решения на основе itemgetter() (черный, эталонное решение ).
Тот же тест с Python 3.5 показал, что методы сравниваются точно так же, как и в случае с Python 2.7, представленном выше
. 6
если is_min_level:
возвращаемые значения.index (мин (значения))
еще:
возвращаемые значения.index (макс. (значения))
8
Вы можете найти минимальный/максимальный индекс и значение одновременно, если вы пронумеруете элементы в списке, но выполните мин/макс на исходных значениях списка. Вот так:
оператор импорта min_index, min_value = min (перечисление (значения), ключ = operator.itemgetter (1)) max_index, max_value = max (перечисление (значения), ключ = operator.itemgetter (1))
Таким образом, список будет пройден только один раз в течение мин. (или макс.).
2
Если вы хотите найти индекс max в списке чисел (что кажется вашим случаем), я предлагаю вам использовать numpy:
import numpy as np ind = np.argmax (мой список)
1
Возможно, более простым решением было бы превратить массив значений в массив пар значений и индексов и взять из него максимальное/минимальное значение. Это даст наибольший/наименьший индекс, который имеет максимальное/минимальное значение (т. е. пары сравниваются, сначала сравнивая первый элемент, а затем сравнивая второй элемент, если первые одинаковы). Обратите внимание, что на самом деле нет необходимости создавать массив, потому что min/max позволяют использовать генераторы в качестве входных данных.
значений = [3,4,5] (m,i) = max((v,i) для i,v в перечислении(значения)) напечатать (м, я) # (5, 2)
0
последовательность = [1,1412, 4,3453, 5,8709, 0,1314] seq.index (мин (seq))
Дает вам первый индекс минимума.
0
Я думаю, что лучше всего преобразовать список в массив numpy и использовать эту функцию:
a = np.array(list) idx = np.argmax (а)
0
Меня это тоже заинтересовало, и я сравнил некоторые из предложенных решений, используя perfplot (мой любимый проект).
Получается, что
min(range(len(a)), key=a.__getitem__)
— самый быстрый метод для маленьких и больших списков.
(В прежних версиях np.argmin использовался для получения пирога.)
Код для создания графика:
import numpy as np
оператор импорта
импортировать перфплот
определение min_enumerate (а):
вернуть мин (перечисление (а), ключ = лямбда х: х [1]) [0]
определение min_enumerate_itemgetter (а):
min_index, min_value = min(enumerate(a), key=operator.itemgetter(1))
вернуть мин_индекс
деф получитьэлемент (а):
вернуть мин (диапазон (длина (а)), ключ = a.__getitem__)
защита np_argmin (а):
вернуть np.argmin (а)
б = perfplot.bench (
setup=лямбда n: np.random.rand(n).
tolist(),
ядра=[
мин_перечисление,
min_enumerate_itemgetter,
получить,
np_argмин,
],
n_range=[2**k для k в диапазоне (15)],
)
б.показать()
3
Я думаю, что приведенный выше ответ решает вашу проблему, но я решил поделиться методом, который дает вам минимум и все индексы, в которых появляется минимум.
minval = min(mylist) ind = [i для i, v в перечислении (mylist), если v == minval]
Это дважды проходит список, но все еще довольно быстро. Однако это немного медленнее, чем поиск индекса первого столкновения с минимумом. Поэтому, если вам нужен только один из минимумов, используйте решение Мэтта Андерсона, если вам нужны все они, используйте это.
4
После получения максимальных значений попробуйте следующее:
max_val = max(list) index_max = список.index(max_val)
Гораздо проще, чем множество вариантов.
Использовать массив numpy и функцию argmax()
a=np.array([1,2,3]) б = np.argmax (а) печать (б) # 2
0
Теперь у Pandas есть гораздо более мягкое решение, попробуйте:
df[column].idxmax()
Это просто возможно с помощью встроенной функции enumerate() и max() и дополнительного аргумента key функции max() и простое лямбда-выражение:
theList = [1, 5, 10] maxIndex, maxValue = max(enumerate(theList), key=lambda v: v[1]) # => (2, 10)
В документах для max() говорится, что аргумент key ожидает функцию, подобную функция list.sort() . Также см. раздел Сортировка.
То же самое работает для min() . Кстати, он возвращает первое максимальное/минимальное значение.
2
Использовать функцию модуля numpy numpy.
where
импортировать numpy как n х = n.массив ((3,3,4,7,4,56,65,1))
Для индекса минимального значения:
idx = n.where(x==x.min())[0]
Для индекса максимального значения:
idx = n.where(x==x.max())[0]
На самом деле эта функция намного мощнее. Вы можете создавать все виды логических операций Для индекса значения от 3 до 60:
idx = n.where((x>3)&(x<60))[0] IDX массив([2, 3, 4, 5]) х [идентификатор] массив([ 4, 7, 4, 56])
4
Допустим, у вас есть список, например:
a = [9,8,7]
Следующие два метода представляют собой довольно компактные способы получения кортежа с минимальным элементом и его индексом. Оба берут аналогично время обработки. Мне больше нравится метод zip, но это на мой вкус.
метод zip
элемент, индекс = мин (список (zip (a, диапазон (len (a))))) мин (список (zip (a, диапазон (len (a))))) (7, 2) время мин (список (zip (a, диапазон (len (a)))))) 1,36 мкс ± 107 нс на цикл (среднее значение ± стандартное отклонение для 7 циклов, 1000000 циклов в каждом)
метод перечисления
индекс, элемент = min(list(enumerate(a)), ключ=лямбда x:x[1]) мин (список (перечисление (а)), ключ = лямбда х: х [1]) (2, 7) timeit мин (список (перечисление (а)), ключ = лямбда х: х [1]) 1,45 мкс ± 78,1 нс на цикл (среднее значение ± стандартное отклонение для 7 циклов, 1000000 циклов в каждом)
Зачем сначала добавлять индексы, а потом их переворачивать? Функция Enumerate() — это всего лишь частный случай использования функции zip().
Используем его соответствующим образом:
my_indexed_list = zip(my_list, range(len(my_list))) минимальное_значение, минимальное_индекс = минимальное (мой_индексированный_список) max_value, max_index = max(my_indexed_list)
Если вы знаете, как использовать лямбда-выражение и аргумент «ключ», простое решение:
max_index = max( range( len(my_list) ), key = lambda index : my_list[ index ] )
1
Все просто:
штук = [2, 4, 8, 15, 11] индекс = вещи.индекс (макс (вещи))
Небольшое дополнение к тому, что уже было сказано. values.index(min(values)) , кажется, возвращает наименьший индекс min. Следующее получает самый большой индекс:
values.reverse()
(values.index(min(значения)) + len(значения) - 1) % len(значения)
значения.reverse()
Последнюю строку можно опустить, если побочный эффект реверсирования на месте не имеет значения.
Для перебора всех вхождений
индексы = []
я = -1
для _ в диапазоне (values.count (min (values))):
я = значения [я + 1:]. индекс (мин (значения)) + я + 1
index.append(i)
Для краткости. Вероятно, лучше кэшировать min(values), values.count(min) вне цикла.
1
Простой способ поиска индексов с минимальным значением в списке, если вы не хотите импортировать дополнительные модули:
минимальное_значение = минимальное (значения) indexes_with_min_value = [i для i в диапазоне (0, len (значения)) if values[i] == min_value]
Затем выберите, например, первый:
selected = indexes_with_min_value[0]
Предположим, что у вас есть список подписчиков my_list = [1,2,3,4,5,6,7,8,9,10] , и мы знаем, что если мы сделаем max(my_list) , он вернет 10 и min(my_list) вернет 1 .
Теперь мы хотим получить индекс максимального или минимального элемента, мы можем сделать следующее.
мой_список = [1,2,3,4,5,6,7,8,9,10] max_value = max(my_list) # возвращает 10 max_value_index = my_list.index(max_value) # возвращает 9 #чтобы получить индекс минимального значения min_value = min(my_list) # возвращает 1 min_value_index = my_list.index(min_value) # retuns 0
https://docs.python.org/3/library/functions.html#max
Если несколько элементов являются максимальными, функция возвращает первый встреченный. Это согласуется с другими инструментами сохранения стабильности сортировки, такими как sorted(iterable, key=keyfunc, reverse=True)[0]
Чтобы получить больше, чем просто первое обнаружение, используйте метод сортировки.
оператор импорта х = [2, 5, 7, 4, 8, 2, 6, 1, 7, 1, 8, 3, 4, 9, 3, 6, 5, 0, 9, 0] мин = Ложь макс = Истина min_val_index = отсортированный (список (zip (x, диапазон (len (x))))), key = operator.itemgetter (0), reverse = min) max_val_index = отсортировано (список (zip (x, диапазон (len (x))))), key = operator.


0
to_numeric(df["Сумма"], errors="coerce")
idx = df[df['Сумма'] == 2287.6].index
print(idx.to_list())
# [5]
index('бар')
1
index
Int64Index([1, 3], dtype='int64')
index(mon.lower())+1
__getitem__)
argmax (мой список)
array(list)
idx = np.argmax (а)
tolist(),
ядра=[
мин_перечисление,
min_enumerate_itemgetter,
получить,
np_argмин,
],
n_range=[2**k для k в диапазоне (15)],
)
б.показать()
