2012-02-25 3 views
2

Я пишу код в Python 2.7, в котором я определил список строк. Затем я хочу искать элементы этого списка для набора букв. Эти буквы должны быть в случайном порядке. т. е. искать список для каждой отдельной буквы на входе. Я гулял вокруг, но я не нашел решения.Строки поиска в списке, содержащие конкретные буквы в случайном порядке

Вот что я получил:

wordlist = ['mississippi','miss','lake','que'] 

letters = str(aqk) 

for item in wordlist: 
    if item.find(letters) != -1: 
     print item 

Это пример. Здесь единственным выходом должно быть «озеро» и «que», поскольку эти слова содержат «a», «q» и «k». Как я могу переписать свой код так, чтобы это было сделано?

Заранее спасибо!

Alex

+0

Пожалуйста, попробуйте правильные ответы и выберите свою любимую форму ниже. Я считаю, что большинство из них будут работать. –

+0

Я бы хотел, но у меня еще недостаточно репутации, чтобы сделать это ... – Alex

ответ

9

Было бы легко с помощью set():

wordlist = ['mississippi','miss','lake','que'] 

letters = set('aqk') 

for word in wordlist: 
    if letters & set(word): 
     print word 

Выход:

lake 
que 

Примечание: Оператор & делает intersection между двумя наборами.

+0

Если список слов исправлен, и этот тест выполняется с разными наборами букв, предварительная конвертация словарного списка в список слов (как в 'wordsetlist = map (set, wordlist)') должна оплачивать быстро. – PaulMcG

+0

Спасибо! Это решило мою проблему. – Alex

+0

Я подумал о другом. Что, если бы я хотел, чтобы результат был точным входом, но не обязательно был устроен таким же образом? – Alex

1
for item in wordlist: 
    for character in letters: 
     if character in item: 
      print item 
      break 
+0

Извините, это печатает элемент, если * любой * символ в буквах находится в элементе; OP хочет проверить, если * все * символы в буквах находятся в элементе. (Пример OP имеет ту же ошибку.) – PaulMcG

+0

Спасибо за ваше предложение в любом случае! – Alex

+0

@PaulMcGuire Ну, пример тоже смутил меня. Думал, что он имел в виду a, q OR k ... –

1

Здесь идет ваше решение:

for item in wordlist: 
    b = False 
    for c in letters: 
    b = b | (item.find(c) != -1) 
    if b: 
    print item 
+1

'item.find (c)! = -1' is * so * last century :) -' c in item' был бы более путинским способом сделать это в эти современные времена; это также примерно в 4 раза быстрее в моих простых тестах. 'python -m timeit '' abcdefghijkl'.find ('d')! = -1" 'vs.' python -m timeit '' d 'в' abcdefghijkl '"' дает соответствующие времена .231 usec против .0602 микросекунды. Кроме того, вы не выполняете короткое замыкание в своем цикле - в идеале, после неудачного поиска нет смысла искать любой из других символов в 'letter'. Вместо повторного выполнения 'all', попробуйте заменить ваш код на' b = all (c в элементе для c в буквах) '. – PaulMcG

+0

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

+0

Нет проблем, вы наверняка получите баллы за то, что OP * сказал * он хотел, хотя он написал пример с ошибкой!Но недавние версии Python добавили некоторые очень приятные идиомы, такие как 'in',' any', 'all' и выражения генератора, так что ваш код рухнет до очень чистого понимания списка, как в представлении от @KarlKnechtel. Эти новые идиомы являются мощными и заслуживают изучения и принятия, даже осмелюсь сказать, дооснащения существующего кода, для их единообразия, улучшения производительности, встроенного короткого замыкания и сокращения кода без обфускации. – PaulMcG

0
[word for word in wordlist if any(letter in word for letter in 'aqk')] 
+0

Я думаю, вы хотите «все», а не «любые». – PaulMcG

+0

(теперь я вижу, что вы и @Ioan реализовали пример кода OP, который имеет ту же ошибку - описание, однако, говорит «искать список для каждой отдельной буквы на входе».) – PaulMcG

0

Использование множеств и в синтаксисе, чтобы проверить.

wordlist = ['mississippi','miss','lake','que'] 

letters = set('aqk') 

for word in wordlist: 
    if word in letters: 
     print word 
Смежные вопросы