如何在字符串中查找非连续字符?

时间:2017-06-11 15:31:34

标签: optimization

我有一个字典文本,我试图在这个字典文本中找到包含指定字符的最长单词。这些字母将由用户输入。例如,如果用户输入“红色”,则程序必须找到包含“r”,“e”和“d”的最长单词。我能够找到包含“r”,“e”或“d”的单词。 如何缩小处所以使存储的单词包含用户输入的所有字母,而不管它们的输入顺序如何?

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

letter = input("Please enter the letters to include: ")

data_file = open("dictionary.txt").read().splitlines()

words = [i for i in data_file if all(b in i for b in letter)]

print(max(words, key = len))

此算法循环显示单词列表并创建一个新列表,其中包含来自用户输入的每个字母的所有单词。然后,代码从过滤后的列表中找到最长的单词。

答案 1 :(得分:0)

您可以使用内置的set类型来简化和加速您想要执行的操作,因为它们可以快速测试文件的每个单词中是否包含所有字母。我还建议您使用with语句自动确保文件已关闭。

如果"dictionary.txt"文件的格式是每行一个字,则可以加快速度。但是,由于您从未描述过它是什么,因此以下并不假设并且应该在文件的每一行上是否有一个或几个。

dict_filename = "dictionary.txt"
outp_filename = "find_right_words.txt"

# user's input
letters = input("Please enter the letters to include: ")
letters = set(letters)  # convert string to set of characters

print("searching for letters: {}".format(', '.join(sorted(letters))))

# find all words in dictionary file that contain all the letters and store them in a file
with open(dict_filename, "r") as data_file, \
     open(outp_filename, "w") as find_right_words:
    for line in data_file:
        for word in line.split():
            if letters.issubset(word):  # all letters in word?
                find_right_words.write(word+'\n')

print("file {!r} created".format(outp_filename))

但是,如果您要做的就是找到包含所有字母的最长单词,那么您真的不需要创建"find_right_words.txt"文件,因为这可以与单词同时确定正在检查文件中。

这就是我的意思:

# find longest word in dictionary file that contains all the letters
with open(dict_filename, "r") as data_file:
    longest_word_len = 0
    for line in data_file:
        for word in line.split():
            if(len(word) > longest_word_len  # is word longer than longest word...
               and letters.issubset(word)):  # and all letters in it?
                longest_word, longest_word_len = word, len(word)

print("longest word found: {!r}".format(longest_word))

请注意,如果有多个相同长度的单词包含所有字母,则会忽略除第一个以外的所有单词。