2

我是 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帖子,并尝试了那里发布的代码return len([word for word in words if len(word) >= 2 and word[0] == word[-1]])。如果源是硬编码列表,它可以工作,但如果源是外部文件,它会失败。

现在,我的问题是,sum适用于列表和元组吗?如果我正确理解了文档,则可以总结任何可迭代的内容。

任何启蒙将不胜感激。:)

4

3 回答 3

7

最简单的解决方案是这样的:

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)
于 2012-04-11T09:22:42.230 回答
1

我刚刚尝试过这个,并且有效,因此它可能与您的文件格式有关:

me@pc:~/Desktop$ cat > words.txt
app
noot
mies
wim
zus
jet
me@ps:~/Desktop$ python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> sum(1 for word in open('words.txt') if 'e' not in word)
4
于 2012-04-11T09:26:08.350 回答
0

好的。我尝试了@Lattyware 编写的代码,它运行良好。我想我已经找到了罪魁祸首,尽管我不明白为什么它会这样。我想这将是另一个问题。:)

def count_words():
    with open("words.txt") as words:
        print sum(1 for word in words)
        print sum(1 for word in words if "e" not in word)


>>> count_words()
113809
0

但是当我注释掉第一个打印语句时,它正确地显示了答案。

>>> count_words()
37641

更新:

我发布了我想出的解决方案,以防其他人遇到同样的问题。

def count_words():
    total = 0
    wordsWithoutE = 0

    with open("words.txt") as words:
        for word in words:
            if 'e' not in word:
                wordsWithoutE += 1

            total += 1

    return (total, wordsWithoutE)


    >>> print count_words()
    (113809, 37641)
于 2012-04-11T09:50:28.933 回答