我试图读取由空格分隔的整数值行,然后对它们执行一些简单的统计计算。
输入的示例行如下所示:
64630 11735 14216
我决定使用此处记录的Python标准库中的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()
会消耗values
列表中的所有元素,然后调用statistics.median()
才能使用它们。 (我确实看到来自print
的第一个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的内容,其中列表只能被读取或迭代一次?或者我试过的两个编译器可能都有一个怪癖?
答案 0 :(得分:2)
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个唯一值没有模式,因此是最后一个例外。