在Python的单词列表中查找三个单词

时间:2019-04-08 05:50:57

标签: python python-3.x

形容词big的比较形式较大,而最高级形式则最大。我想打印出所有这些三元组(早,早,最早)或(难,难,最难),...

我正在使用Python打开包含大约5000个单词的wordList.txt。我已经在一个小文件上完美地测试了我的代码,但是由于循环太长,因此无法在大文件上运行。

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference questionsRef = rootRef.collection("questions");
DocumentReference docRef = questionsRef.document("yCCRgoRIAmtmKmTFLYJX");
docRef.update("question", updatedText);

请问其他可以优化运行时间的算法!

3 个答案:

答案 0 :(得分:1)

您可以构建一个dict,其单词的根作为键,列表中的所有变体作为值。然后,我们仅将条目保留为3个值。这样,我们只在列表上迭代一次,并在创建的字典上迭代一次,从而使整个过程保持O(n)。

我们可以使用defaultdict来更轻松地构建字典。请注意,root函数可能需要改进,请检查您的英语形容词列表!

from collections import defaultdict


def root(word):
    if len(word) < 4:
        return word
    if word[-3:] == 'ier':
        return word[:-3] + 'y'
    elif word[-4:] == 'iest':
        return word[:-4] + 'y'
    elif word[-2:] == 'er':
        return word[:-2]
    elif word[-3:] == 'est':
        return word[:-3]
    else:
        return word

def find_triples(words):
    out_dict = defaultdict(list)
    for word in words:
        out_dict[root(word)].append(word)

    # keep only the lists with 3 distinct values, sorted by length
    out = [sorted(set(values), key=len) for values in out_dict.values() 
                                   if len(set(values))==3]
    return out


data = ['early', 'earlier', 'earliest', 'or', 'hard', 'harder', 'hardest', 'ignored']
print(find_triples(data))
# [['early', 'earlier', 'earliest'], ['hard', 'harder', 'hardest']]

答案 1 :(得分:0)

非常感谢您发布Thierry Lathuille。自从我查看了您的答案以来,已经过去了4个小时。我不足以理解您的代码。我确实像这样调整了root(word)函数:

def root(word):
    if len(word) < 4:
        return word
    if word[-3:] == 'ier':
        return word[:-3] + 'y'
    elif word[-4:] == 'iest':
        return word[:-4] + 'y'
    elif word[-2:] == 'er':
        if word[-4:-3]==word[-3:-2]:
            return word[:-3]
        else:
            return word[:-2]
    elif word[-3:] == 'est':
        if word[-4:-3]==word[-5:-4]:
            return word[:-4]        
        return word[:-3]
    else:
        return word

但是现在有两个问题: 首先,单词表中有重复的单词,因此会产生类似[terry,terry,terrier]的内容。

第二,要找到这样的三元组[大,更大,最大]真的很困难

我的矿井生产[whin,whiner,whinerner],[willy,willier,willyer],[slat,slater,slatter],...

假设不允许我先删除重复的单词。因此,有什么方法可以访问每个键中的每个值。我想比较那些对值以消除不必要的结果。

蒂埃里(Thierry),如果有时间,您能解释一下这段代码吗?

out = [sorted(values, key=len) for values in out_dict.values() if len(values)==3]

我真的很不懂列表理解。

答案 2 :(得分:0)

您似乎正在努力以一致的方式来阻止字词。 对于您的情况,您可以使用一系列模式替换规则,即“如果单词以 this 模式结尾,则将其替换为 that ”。 使用正则表达式,您可以轻松指定模式和替换内容,包括诸如“如果它以重复字母结尾,则用该字母的单个实例替换”之类的东西。

例如:

def root(word):
  pattern_replacements = [
    ("e$", ""),    # fine => fin (to match finer, finest)
    ("y$", "i"),   # tiny => tini (to match tinier, tiniest)
    ("er$", ""),
    ("est$", ""),
    (r"([a-z])\1$", r"\1")  # bigger => big 
  ]

  for pattern, replacement in pattern_replacements:
    word = re.sub(pattern, replacement, word)

  return word


words = "big bigger biggest tiny tinier tiniest fine finer finest same samer samest good gooder goodest".split(" ")
map(root, words)
# ['big', 'big', 'big', 'tini', 'tini', 'tini', 'fin', 'fin', 'fin', 'sam', 'sam', 'sam', 'good', 'good', 'good']