>>> ["foo", "bar", "baz"].index("bar") 1
Ссылка: Структуры данных> Больше в Списках
Протесты следуют
Примечание, которое, в то время как это - возможно, самый чистый способ ответить на вопрос , как спросили ,
index
, довольно слабый компонентlist
API, и я не могу помнить прошлый раз, когда я использовал его в гневе. На это указали мне в комментариях, что, потому что на этот ответ в большой степени ссылаются, это должно быть сделано больше завершенным. Некоторые протесты [приблизительно 117] следуют. Это, вероятно, стоит первоначально смотреть на docstring для него:>>> print(list.index.__doc__) L.index(value, [start, [stop]]) -> integer -- return first index of value. Raises ValueError if the value is not present.
Линейная временная сложность в длине списка
index
вызов проверяет каждый элемент списка в порядке, пока это не находит соответствие. Если Ваш список длинен, и Вы не знаете примерно, где в списке он происходит, этот поиск мог стать узким местом. В этом случае необходимо рассмотреть различную структуру данных. Обратите внимание, что, если Вы знаете примерно, где найти соответствие, можно датьindex
подсказка. Например, в этом отрывке,l.index(999_999, 999_990, 1_000_000)
примерно пять порядков величины быстрее, чем прямойl.index(999_999)
, потому что первый только должен искать 10 записей, в то время как последние поиски миллион:>>> import timeit >>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000) 9.356267921015387 >>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000) 0.0004404920036904514
Только возвраты индекс первое соответствие к его аргументу
А звонят в [1 112], перерывает список в порядке, пока это не находит соответствие, и остановки там. , Если Вы ожидаете нуждаться в индексах большего количества соответствий, необходимо использовать понимание списка или выражение генератора.
>>> [1, 1].index(1) 0 >>> [i for i, e in enumerate([1, 2, 1]) if e == 1] [0, 2] >>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1) >>> next(g) 0 >>> next(g) 2
Большинство мест, где я однажды использовал бы
index
, я теперь, использует понимание списка или выражение генератора, потому что они более generalizable. Таким образом, если Вы рассматриваете достижение для [1 114], смотрите на эти превосходные функции Python.Броски, если элемент, не существующий в списке
, А звонят в [1 115] результаты в
ValueError
если объект не существующий.>>> [1, 1].index(2) Traceback (most recent call last): File "
", line 1, in ValueError: 2 is not in list , Если объект не мог бы присутствовать в списке, Вы должны любой
- Проверка на него сначала с [1 117] (чистый, читаемый подход), или
- Обертка эти
index
вызов вtry/except
блок, который ловитValueError
(вероятно, быстрее, по крайней мере, то, когда список для поиска длинен, и объект, обычно присутствует.)
Похоже, ответ состоит в том, чтобы предоставить MODI больший холст. Я также пытался сделать снимок экрана элемента управления и распознавать его и столкнулся с той же проблемой. В конце концов, я взял изображение элемента управления, скопировал изображение в более крупное растровое изображение и распечатал большее растровое изображение.
Еще одна проблема, которую я обнаружил, заключалась в том, что у вас должно быть правильное расширение для вашего файла изображения. Другими словами, .tmp его не сокращает.
Я сохранил работу по созданию более крупного источника внутри моего метода распознавания текста, который выглядит примерно так (я имею дело непосредственно с объектами изображения):
public static string ExtractText(this Image image)
{
var tmpFile = Path.GetTempFileName();
string text;
try
{
var bmp = new Bitmap(Math.Max(image.Width, 1024), Math.Max(image.Height, 768));
var gfxResize = Graphics.FromImage(bmp);
gfxResize.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
bmp.Save(tmpFile + ".bmp", ImageFormat.Bmp);
var doc = new MODI.Document();
doc.Create(tmpFile + ".bmp");
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
var img = (MODI.Image)doc.Images[0];
var layout = img.Layout;
text = layout.Text;
}
finally
{
File.Delete(tmpFile);
File.Delete(tmpFile + ".bmp");
}
return text;
}
Я не точно знаю, каков минимальный размер, но похоже, что 1024 x 768 помогает.
У меня была такая же проблема при использовании
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
в файле TIFF размером 2400x2496. Изменение его размера до 50% (уменьшение размера) устранило проблему, и метод больше не генерировал исключение, однако он неправильно распознавал текст, например обнаруживал «релевантность» вместо «ссылка» или «712017» вместо «712517». . Я продолжал пробовать разные размеры изображений, но у всех была одна и та же проблема, пока я не изменил команду на
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
, что означало, что я не хочу, чтобы она определяла ориентацию и не исправляла перекосы. Теперь команда отлично работает со всеми изображениями, включая tiff 2400x2496.
Надеюсь, это поможет людям, столкнувшимся с той же проблемой
modi ocr работает только со мной. попробуйте сохранить изображение в формате "tif".
извините, мой плохой английский
У меня была та же проблема "Проблема с OCR" с некоторыми изображениями. Я изменил масштаб изображения (в моем случае на 50%), т.е. уменьшил его размер и вуаля! это работает!
да, сообщения в этой теме помогли мне заставить его работать, вот что я могу добавить:
пытался загрузить изображения (маленькие), затем ocr...
- при обработке изображений, кажется, что их размер должен быть равен 2! ( удалось обработать изображения: 512x512, 128x128, 256x64 ... другие размеры в основном не удавались (например, 1103x334))
прозрачный фон также создавал проблемы. Я получил наилучшие результаты, когда создал новый tif с границами powerof2, белым фоном, вставил в него загруженное изображение, сохранил.
масштабирование изображения не помогло, так как OCR дает неправильные результаты, особенно для "немецких" символов, таких как "ü".
в конце концов я также использовал: doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
используя modi из office 2003
greetings
womd