【发布时间】:2021-02-20 13:28:59
【问题描述】:
我需要在列表中为字母表中的每个字母找到最长的字符串。 我的第一个直截了当的方法如下所示:
alphabet = ["a","b", ..., "z"]
text = ["ane4", "anrhgjt8", "andhjtje9", "ajhe5", "]more_crazy_words"]
result = {key:"" for key in alphabet} # create a dictionary
# go through all words, if that word is longer than the current longest, save it
for word in text:
if word[0].lower() in alphabet and len(result[word[0].lower()]) < len(word):
result[word[0].lower()] = word.lower()
print(result)
返回:
{'a': 'andhjtje9'}
正如它应该做的那样。
为了练习字典理解,我试图用一行来解决这个问题:
result2 = {key:"" for key in alphabet}
result2 = {word[0].lower(): word.lower() for word in text if word[0].lower() in alphabet and len(result2[word[0].lower()]) < len(word)}
我刚刚将 if 语句复制到了理解循环中... 然而结果 2 是:
{'a': 'ajhe5'}
有人能解释一下为什么会这样吗?我觉得我做的和第一个循环完全一样...... 感谢您的帮助!
【问题讨论】:
-
您使用
result2的先前值,在计算字典理解之前一直将空字符串作为值 -
for需要在alphabet上并通过过滤第一个字符并构造(length, string)的元组来找到最大长度的单词,然后使用键函数找到最大值,然后提取字符串找到的最大值 -
您可以申请
groupby():{g: i for g, (*_, i) in groupby(sorted(text, key=lambda x: (len(x), x[0])), itemgetter(0)) if 96 < ord(g) < 123}。导入:groupby()、itemgetter()(您可以将itemgetter(0)替换为lambda x: x[0])。我用ascii字符码过滤a .. z,检查ASCII table。 -
@PatrickArtner,对不起我的错误......它返回'andhjtje9'......我将编辑帖子
-
@rioV8 谢谢,这基本上就是我正在寻找的解释!我没有意识到它仍然将值与空字符串进行比较,因为新的 dict 尚未创建,而在“经典” for 循环中它是!
标签: python for-loop dictionary-comprehension