Проблема сравнения строк Python

#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 a dict() . поскольку вы заинтересованы в поиске, это будет намного быстрее, чем a list или a tuple

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. Вы также можете писать списки списков как свои традиционные циклы для лучшей читаемости (хотя я предпочитаю стиль составления списка по умолчанию)…