Самый эффективный способ найти, содержит ли большой список определенную строку (Python)

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

8
задан Roee Adler 16 May 2009 в 12:01
поделиться

9 ответов

Python Set - это то, что вы должны попробовать.

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

17
ответ дан 5 December 2019 в 05:19
поделиться

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
4
ответ дан 5 December 2019 в 05:19
поделиться

A Trie structure would suit your purposes. There are undoubtedly Python implementations to be found out there...

3
ответ дан 5 December 2019 в 05:19
поделиться

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.

1
ответ дан 5 December 2019 в 05:19
поделиться

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.

2
ответ дан 5 December 2019 в 05:19
поделиться

Вы в основном проверяете, входит ли элемент в набор, верно?

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

Или используйте ту структуру данных, которая используется bash для автозаполнения имен команд - это быстро и высокоэффективно в памяти (может имя не помню).

1
ответ дан 5 December 2019 в 05:19
поделиться

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?

2
ответ дан 5 December 2019 в 05:19
поделиться

Другие предоставили вам способ в памяти с помощью 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).

2
ответ дан 5 December 2019 в 05:19
поделиться

Преобразование списка в набор будет полезно только в том случае, если вы неоднократно запускаете этот вид запроса к данным, как и сортировка списка и выполнение двоичного поиска. Если вы собираетесь извлекать данные из списка только один раз, лучше всего подойдет простой старый линейный поиск:

if 'foo' in some_list:
    do_something()

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

Наконец, третий вариант - вы можете импортировать данные в базу данных sqlite и читать напрямую от него. Sqlite очень быстр, и он может избавить вас от необходимости загружать весь список из файла.

0
ответ дан 5 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: