2017-01-24 2 views
1

空白で区切られた整数値の行を読み込み、その上で簡単な統計計算を実行しようとしています。 https://docs.python.org/3/library/statistics.htmlstatistics.mean()を呼び出すときにリストが消費される

ここ

アクションでそれを次のとおりです:

import sys 
import statistics 

values = map(int, sys.stdin.readline().split()) 

print(statistics.mean(values)) 
print(statistics.median(values)) 
print(statistics.mode(values)) 
私はここに文書化Pythonの標準ライブラリから statisticsモジュールを使用することにしました

64630 11735 14216 

:とても似

入力の例ラインが見えます

実行すると、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.median()への呼び出しは、それらを使用することができます前に、statistics.mean()への最初の呼び出しがvaluesリスト内のすべての要素を消費しているようです。 (I stdoutから最初printのステートメントからの出力を参照してください、そうstatistics.mean()への呼び出しがうまく働いた。)

入力処理はすべての問題を持っていないようです。

stdoutから次を出力
import sys 
import statistics 

values = map(int, sys.stdin.readline().split()) 

for v in values: 
    print(v) 

:私は期待どおりに動作、次のコードを持っている標準ライブラリのマニュアルの

64630 
11735 
14216 

何もこれらの関数は、渡されたパラメータを消費言及していないこれらの標準的な機能のそれぞれを。値を返すだけでリスト自体は変更しないでください。

リストには一度だけ読み込みまたは反復することができるPython固有のものがありますか?それとも、私が試したコンパイラの両方で奇妙なことがありますか?

答えて

0

map()はiterableを生成し、それ以上の反復はonceしか実行できません。あなたが結果を再利用することができるようにしたい場合は、最初の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つのユニーク値のご入力は、したがって何のモード、最後の例外を持っていません。

+0

'map()'は、私が想定していたのと同じ型を渡す代わりに実際にはイテレータを返します。 ありがとうございました! – bmedev

関連する問題