调用statistics.mean()时消耗的列表

时间:2017-01-24 22:02:39

标签: python list python-3.x statistics

我试图读取由空格分隔的整数值行,然后对它们执行一些简单的统计计算。

输入的示例行如下所示:

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的内容,其中列表只能被读取或迭代一次?或者我试过的两个编译器可能都有一个怪癖?

1 个答案:

答案 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个唯一值没有模式,因此是最后一个例外。