Вам нужно будет пройтись по каждому доктору и проверить, является ли ваша строка подстрокой. Сохраните каждого доктора, в котором есть ваша подстрока, и отобразите остальные данные.
Python Set - это то, что вы должны попробовать.
Объект набора - это неупорядоченный набор отдельных хешируемых объектов. Обычное использование включает проверку принадлежности , удаление дубликатов из последовательности и вычисление математических операций, таких как пересечение, объединение, разность и симметричная разность.
Sample Python code:
L = ['foo', 'bar', 'baz'] # Your list
s = set(L) # Converted to Set
print 'foo' in s # True
print 'blah' in s # False
A Trie structure would suit your purposes. There are undoubtedly Python implementations to be found out there...
If memory consumption isn't an issue and the words won't change, the fastest way to do this is put everything in a hash and search that way. In Python, this is the Set
. You'll have constant-time lookup.
500k character is not a large list. if items in your list are unique and you need to do this search repeatedly use set
which would lower the complexity to O(1)
in the best case.
Вы в основном проверяете, входит ли элемент в набор, верно?
Если да, и поскольку вы сказали, что у вас много памяти, почему бы просто не загрузить все слова в качестве ключей в кэше памяти, а затем для каждого слова просто проверяйте, присутствует оно в кэше памяти или нет.
Или используйте ту структуру данных, которая используется bash для автозаполнения имен команд - это быстро и высокоэффективно в памяти (может имя не помню).
Two things:
The Python 'mutable set' type has an 'add' method ( s.add(item) ), so you could go right from reading (a line) from your big file straight into a set without using a list as an intermediate data structure.
Python lets you 'pickle' a data structure, so you could save your big set to a file and save the time of reinitiating the set.
Second, I've been looking for a list of all the single-syllable words in English for my own amusement, but the ones I've found mentioned seem to be proprietary. If it isn't being intrusive, could I ask whether your list of English words can be obtained by others?
Другие предоставили вам способ в памяти с помощью set (), и это, как правило, будет самым быстрым способом, и он не должен загружать вашу память для набора данных из 60 тысяч слов ( не более нескольких мегабайт). Вы должны иметь возможность построить свой набор с помощью:
f=open('words.txt')
s = set(word.strip() for word in f)
Однако для загрузки набора в память требуется некоторое время. Если вы проверяете много слов, это не проблема - время поиска более чем компенсирует это. Однако если вы re будет проверять только одно слово на выполнение команды (например, это приложение командной строки, такое как "checkenglish [word]") время запуска будет больше, чем вам потребовалось бы для простого поиска по файлу построчно.
. Если это ваша ситуация или у вас гораздо больший набор данных, лучше использовать дисковый формат. Самый простой способ - использовать модуль dbm . Создайте такую базу данных из списка слов с помощью:
import dbm
f=open('wordlist.txt')
db = dbm.open('words.db','c')
for word in f:
db[word] = '1'
f.close()
db.close()
Затем ваша программа может проверить членство с помощью:
db = dbm.open('words.db','r')
if db.has_key(word):
print "%s is english" % word
else:
print "%s is not english" % word
Это будет медленнее, чем поиск набора, так как будет доступ к диску, но будет быстрее, чем поиск, с низким использованием памяти и отсутствие значительного времени инициализации.
Существуют также другие альтернативы, такие как использование базы данных SQL (например, sqlite).
) время запуска будет больше, чем вам потребовалось бы, если бы вы просто перебирали файл построчно.Если это ваша ситуация, или у вас гораздо больший набор данных, лучше использовать дисковый формат. Самый простой способ - использовать модуль dbm . Создайте такую базу данных из списка слов с помощью:
import dbm
f=open('wordlist.txt')
db = dbm.open('words.db','c')
for word in f:
db[word] = '1'
f.close()
db.close()
Затем ваша программа может проверить членство с помощью:
db = dbm.open('words.db','r')
if db.has_key(word):
print "%s is english" % word
else:
print "%s is not english" % word
Это будет медленнее, чем поиск набора, так как будет доступ к диску, но будет быстрее, чем поиск, с низким использованием памяти и отсутствие значительного времени инициализации.
Существуют также другие альтернативы, такие как использование базы данных SQL (например, sqlite).
) время запуска будет больше, чем вам потребовалось бы, если бы вы просто перебирали файл построчно.Если это ваша ситуация, или у вас гораздо больший набор данных, лучше использовать дисковый формат. Самый простой способ - использовать модуль dbm . Создайте такую базу данных из списка слов с помощью:
import dbm
f=open('wordlist.txt')
db = dbm.open('words.db','c')
for word in f:
db[word] = '1'
f.close()
db.close()
Затем ваша программа может проверить членство с помощью:
db = dbm.open('words.db','r')
if db.has_key(word):
print "%s is english" % word
else:
print "%s is not english" % word
Это будет медленнее, чем поиск набора, так как будет доступ к диску, но будет быстрее, чем поиск, с низким использованием памяти и отсутствие значительного времени инициализации.
Существуют также другие альтернативы, такие как использование базы данных SQL (например, sqlite).
Самый простой способ - использовать модуль dbm . Создайте такую базу данных из списка слов с помощью:import dbm
f=open('wordlist.txt')
db = dbm.open('words.db','c')
for word in f:
db[word] = '1'
f.close()
db.close()
Затем ваша программа может проверить членство с помощью:
db = dbm.open('words.db','r')
if db.has_key(word):
print "%s is english" % word
else:
print "%s is not english" % word
Это будет медленнее, чем поиск набора, так как будет доступ к диску, но будет быстрее, чем поиск, с низким использованием памяти и отсутствие значительного времени инициализации.
Существуют также другие альтернативы, такие как использование базы данных SQL (например, sqlite).
Самый простой способ - использовать модуль dbm . Создайте такую базу данных из списка слов с помощью:import dbm
f=open('wordlist.txt')
db = dbm.open('words.db','c')
for word in f:
db[word] = '1'
f.close()
db.close()
Затем ваша программа может проверить членство с помощью:
db = dbm.open('words.db','r')
if db.has_key(word):
print "%s is english" % word
else:
print "%s is not english" % word
Это будет медленнее, чем поиск набора, так как будет доступ к диску, но будет быстрее, чем поиск, с низким использованием памяти и отсутствие значительного времени инициализации.
Существуют также другие альтернативы, такие как использование базы данных SQL (например, sqlite).
Преобразование списка в набор будет полезно только в том случае, если вы неоднократно запускаете этот вид запроса к данным, как и сортировка списка и выполнение двоичного поиска. Если вы собираетесь извлекать данные из списка только один раз, лучше всего подойдет простой старый линейный поиск:
if 'foo' in some_list:
do_something()
В противном случае лучше всего использовать либо упомянутый набор, либо бинарный поиск. Какой из них выбрать, во многом зависит от размера данных и объема памяти, который вы можете сэкономить. Мне сказали, что действительно большие списки, как правило, больше выигрывают от хеширования, хотя объем занимаемой памяти может быть непомерно дорогим.
Наконец, третий вариант - вы можете импортировать данные в базу данных sqlite и читать напрямую от него. Sqlite очень быстр, и он может избавить вас от необходимости загружать весь список из файла.