【问题标题】:Stop printing of generator expression once empty一旦为空,停止打印生成器表达式
【发布时间】:2018-07-06 08:59:49
【问题描述】:

我有一个相当基本的代码来测试生成器函数和生成器表达式。它就像一个魅力,但我不知道如何让生成器表达式genPairs 在达到最终值后停止打印。我已经尝试使用for i in range (0, xyz) 来表示 xyz 是许多不同的 len() 调用,但是每当我尝试使用生成器表达式的大小时都会出错。为了节省您的时间,我的问题是关于 Python 代码的最后 3 行。

代码:

import re
def genLetters(string):

    for letter in string:
        yield letter


letterTable = {}
print("Input your string")
regex = re.compile('[^a-zA-Z]')
inStr = input()
newString = regex.sub("",inStr).lower()
test = genLetters(newString)

for i in range(0,len(newString)):
    temp = next(test)
    if temp  not in letterTable:
        letterTable[temp] = 1
    else:
        letterTable[temp] +=1


letterTable = iter(sorted(letterTable.items()))

genPairs = (item for item in letterTable)
while genPairs:
    print(next(genPairs))

输出:

    Input your string
porkpork
('k', 2)
('o', 2)
('p', 2)
('r', 2)
Traceback (most recent call last):
  File "hw2-1.py", line 27, in <module>
    print(next(genPairs))
StopIteration

我该怎么做才能让它不打印traceback...stop iteration 废话? 有没有办法限制

【问题讨论】:

  • while genPairs: 将无限运行,因为您的生成器是真实的。

标签: python generator iterable


【解决方案1】:

for 循环将耗尽生成器并为您捕获 StopIteration

for element in genPairs:
    print(element)

使用代码while genPairs 没有意义,因为生成器表达式本身总是真实的。

【讨论】:

  • 在我希望它被调用之前,它仍然没有被内存占用?
  • 对于生成器本身,是的。但请注意,您之前已经使用 sorted 将所有这些数据扩展至内存。
  • 当,好点。我试图避免这种情况,以便真正受益于生成器表达式而不是列表理解。问题是我希望它按字母顺序排序。您可能会建议在不扩展内存的情况下进行哪些排序?
  • @Podo 你最多有26个项目,你为什么要关心内存?
  • 你不能。排序是需要访问整个序列的操作。
【解决方案2】:

似乎有大量不必要的代码和生成器没有任何好处。我已经在下面为你清理了。

此解决方案无需迭代生成器,并包含 collections.Counter 来为您执行计数。

from collections import Counter
import re

print('Input your string')
regex = re.compile('[^a-zA-Z]')
inStr = input()
newString = regex.sub('', inStr).lower()

letterTable = Counter(newString)

for k in sorted(letterTable):
    print((k, letterTable[k]))

【讨论】:

    猜你喜欢
    • 2021-04-26
    • 2022-01-07
    • 2021-01-18
    • 2013-03-02
    • 2014-09-10
    • 2013-12-07
    • 1970-01-01
    • 2020-10-05
    相关资源
    最近更新 更多