Python - 如果源是文件,则 Sum 在列表理解语法中不起作用

标签 python sum list-comprehension

我是 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/

相关文章:

python - 根据另外 2 个列表的索引比较 2 个列表,并使用列表理解将索引保存在新列表中

python - 我可以检查 pandas dataframe 索引是否结束?

Python Pandas - 如何在 Excel 工作表中的特定列中写入

python - Pandas 数据框分组依据 : sum/count of only positive numbers

R 带条件和重置的累积总和

mysql - 在 mssql 中,用 '$$' 分隔的整数对单元格中的值求和,但数据类型为 varchar

python - 按列表中第一项分组的列表列表中元素的平均值

python - 是否应该保护登录表单免受 CSRF 的影响?

java - JTable 中值的求和与乘法

Python3 : Matching elements between two lists based upon substrings