我是 Python 的新手,正在研究列表理解。
我想做的是将以下代码转换为列表推导式:
def words_without_e():
count = 0
words = open('words.txt')
for word in words:
if word.find('e') == -1:
count += 1
words.close()
return count
这是我微弱的尝试:
words = open('words.txt')
print sum([1 for word in words if word.find('e') == -1])
但不幸的是,它不起作用。我希望得到的答案是 37641,但我得到的是 0。:(
我尝试创建另一个代码来做同样的事情,但我没有使用文件作为源,而是使用了一个列表:
def test():
words = ['hello', 'world', 'ciao']
return sum([1 for word in words if word.find('e') == -1])
而且有效。
我看到了这个“相当”相似的 SO post并尝试了那里发布的代码 return len([word for word in words if len(word) >= 2 and word[0] == word[-1]])
。如果源是硬编码列表,它会工作,但如果源是外部文件,它会失败。
现在,我的问题是,sum
是否只适用于列表和元组? 如果我理解 docs正确地,任何可迭代的都可以被总结。
任何启发将不胜感激。 :)
最佳答案
最简单的解决方案是这样的:
with open("words.txt") as words:
sum(1 for word in words if "e" not in word)
如您所见,sum
确实适用于任何迭代器 - 这里我使用的是生成器表达式。
与其执行 word.find('e') == -1
,我们还可以直接执行 "e"not in word
,这样更易读并且可以作为字符串本身是可迭代的,并且支持 __contains__
。
我还使用 with
语句打开文件 - 这比手动打开和关闭文件更可取,因为它会为您处理这些事情,并且还能正确处理异常。
但是我想指出,您的示例对我有用。我的猜测是您的文件是用空格或逗号分隔的,但循环遍历文件会返回行。
我的测试文件:
bob
bill
james
test
something
no
例如,这将不起作用:
bob bill james test something no
因为我们将得到一个包含所有内容的字符串。在这种情况下,我们可以使用 str.split()
将行拆分为单词。
例如:
with open("words.txt") as lines:
sum(1 for line in lines for word in line.split() if "e" not in word)
关于Python - 如果源是文件,则 Sum 在列表理解语法中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10103107/