#python #list #compare #substring
#python #Список #Сравнить #подстрока
Вопрос:
У меня есть некоторый код, который выглядит следующим образом:
valid = set()
for string in substrings:
for line in dictionary_words:
if string in line:
valid.add(string)
f.writelines(sorted(valid))
Оба dictionary_words и substrings в настоящее время являются списками.
После substring
того, как найдено внутри any dictionary_words
, оно должно просто идти вперед и переходить к следующему substring
.
Каков наилучший способ написать это?
Комментарии:
1. @F.C.: почему бы не опубликовать это в качестве ответа, поскольку это именно то, о чем просит операционная система?
Ответ №1:
valid = set()
for string in substrings:
for line in dictionary_words:
if string in line:
valid.add(string)
break
f.writelines(sorted(valid))
@F.C.: Если вы используете continue
вместо break
, он запустит следующую итерацию внутреннего цикла for .
Комментарии:
1. Будет ли использование ‘break’ переходить к следующей «строке в dictionary_words» или к следующей «строке в подстроках»?
2. Если бы был оператор на том же уровне отступа
for line in ...
, что и после разрыва, он бы перескочил туда. Но поскольку ничего нет, это продолжится со следующимstring in substrings
3. @Srikar: Я думаю, что сделать его словарем и использовать
dictionary_of_dictionary_words.has_key(string)
не будет работать, какstring in line
и сопоставление подстрок, а has_key — нет. Или, может быть, я что-то упускаю.4. Это потрясающе, спасибо. И «продолжить» переместится на следующую «строку в dictionary_words», я так понимаю, это правильно?
5. ДА. Поэтому не имеет никакой пользы, поскольку это не изменит поток программы.
Ответ №2:
Почему бы не попробовать это —
valid = set()
for string in substrings:
if dictionary_words.has_key(string):
valid.add(string)
f.writelines(sorted(valid))
Нет необходимости в дополнительном цикле for внутри основного цикла for. Это has_key
решает вашу проблему перехода к следующей подстроке is string
is not in dictionary_word
.
надеюсь, это поможет…
Комментарии:
1. dictionary_words — это список, хотя я, вероятно, мог бы сделать его кортежем.
2. создайте
dictionary_words
adict()
. поскольку вы заинтересованы в поиске, это будет намного быстрее, чем alist
или atuple
3. dictionary_words был списком, хотя я, вероятно, мог бы сделать его словарем. Извините, это явно сбивало с толку в вопросе в ретроспективе.
Ответ №3:
Следующий (непроверенный код) должен быть эквивалентен вашим циклам:
valid = set(s for s in substrings for ln in dictionary_words if s in ln)
В Python 3.0 вы могли бы использовать понимание набора:
valid = {s for s in substrings for ln in dictionary_words if s in ln}
Немного эффективнее:
valid = set(s for s in substrings if any(s in ln for ln in dictionary_words))
Комментарии:
1. Нет проблем, последняя строка на самом деле больше похожа на то, что вы ищете, и эквивалентна добавлению
break
инструкции.
Ответ №4:
[valid.add(my_string) for my_string in substrings for line in dictionary_words if my_string in line]
f.writelines(sorted(valid))
Использование понимания списка было бы быстрее, используя циклы так, как вы реализовали.
Комментарии:
1. Большое вам спасибо. К сожалению, циклы были лучше, чем моя последняя версия, которая была действительно уродливой. Я прочитаю о понимании списка.
2. Вы также можете писать списки списков как свои традиционные циклы для лучшей читаемости (хотя я предпочитаю стиль составления списка по умолчанию)…