2017-01-24 3 views
1

Я пытаюсь прочитать строку целочисленных значений, разделенных пробелами, а затем выполнить несколько простых статистических вычислений на них.Список, используемый при вызове статистики.mean()

Пример строка ввода выглядит так:

64630 11735 14216 

Я решил использовать statistics модуль из стандартной библиотеки Python документированной здесь: 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

map() производит итерацию, итерацию можно выполнить только . Если вы хотите, чтобы иметь возможность повторно использовать результат, составить список первым из map() результатов первых:

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

Вы также можете использовать список понимание:

values = [int(i) for i in sys.stdin.readline().split()] 

Demo, используя 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

Смежные вопросы