形容词big的比较形式较大,而最高级形式则最大。我想打印出所有这些三元组(早,早,最早)或(难,难,最难),...
我正在使用Python打开包含大约5000个单词的wordList.txt。我已经在一个小文件上完美地测试了我的代码,但是由于循环太长,因此无法在大文件上运行。
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference questionsRef = rootRef.collection("questions");
DocumentReference docRef = questionsRef.document("yCCRgoRIAmtmKmTFLYJX");
docRef.update("question", updatedText);
请问其他可以优化运行时间的算法!
答案 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']