我试图读取一行由空格分隔的整数值,然后对它们执行一些简单的统计计算。
一个示例输入行如下所示:
64630 11735 14216我决定使用这里记录的中的statistics模块:https://docs.python.org/3/library/statistics.html
这就是它的作用:
import sys
import statistics
values = map(int, sys.stdin.readline().split())
print(statistics.mean(values))
print(statistics.median(values))
print(statistics.mode(values))执行后,我从stderr获得以下输出
Traceback (most recent call last):
File "file.py", line 7, in <module>
print(statistics.median(values))
File "/usr/lib/python3.4/statistics.py", line 313, in median
raise StatisticsError("no median for empty data")
statistics.StatisticsError: no median for empty data因此,对statistics.mean()的第一个调用似乎是在调用statistics.median()之前使用values列表中的所有元素。(我确实看到了来自stdout的第一个stdout语句的输出,因此对statistics.mean()的调用运行良好。)
输入处理似乎没有任何问题。我有如下代码,如预期的那样工作:
import sys
import statistics
values = map(int, sys.stdin.readline().split())
for v in values:
print(v)从stdout输出以下内容
64630
11735
14216标准库文档中没有提到使用传入的参数的这些函数。这些标准函数中的每一个只应返回一个值,而不应更改列表本身。
是否有特定于Python的东西,其中一个列表只能被读取或迭代一次?或者,我尝试过的两个编译器是否都有怪癖?
发布于 2017-01-24 22:03:54
map()生成一个可迭代的,并且迭代只能进行一次。如果您希望能够重用结果,请首先从map()结果中生成一个列表:
values = list(map(int, sys.stdin.readline().split()))您还可以使用列表理解:
values = [int(i) for i in sys.stdin.readline().split()]演示,使用list(map(...))
>>> from io import StringIO
>>> import statistics
>>> demo = StringIO('64630 11735 14216\n')
>>> values = list(map(int, demo.readline().split()))
>>> print(statistics.mean(values))
30193.666666666668
>>> print(statistics.median(values))
14216
>>> print(statistics.mode(values))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/statistics.py", line 507, in mode
'no unique mode; found %d equally common values' % len(table)
statistics.StatisticsError: no unique mode; found 3 equally common values您输入的3个唯一值没有模式,因此出现了最后一个异常。
https://stackoverflow.com/questions/41839769
复制相似问题