2016-05-04 2 views
2

Я относительно новичок в программировании и математике, поэтому простите меня, если я не задаю этот вопрос правильным образом. В принципе у меня есть диапазон дат, например:В Python, как я могу отображать значения на другой масштаб?

dateList = ['1818', '1813', '1818', '1811', '1813'] 

и я хочу, чтобы построить эти в конечном счете, но функция участок нуждается значения между, скажем, 30 и 80 для того, чтобы хорошо выглядеть. Это означает, что минимальное этого множества, 1811, должно быть 30, а максимальная, 1818, должно быть 80. Есть ли способ, чтобы написать функцию fancyMap, что:

fancyMap(dateList, (30, 80)) 

выдает что-то вроде (угадывание здесь):

[80, 52, 80, 30, 52] 

Я знаю, что здесь есть какая-то простая математика, но я не уверен, что это такое.

+0

Я думаю, что самое низкое значение в вашем входе будет отображать в мин связанной вы переходите к функции карты, не так ли? В вашем примере 1811 должен быть преобразован в 20 в выходной набор. Возможно, я неправильно понимаю, что вы здесь просите. –

+0

Да. Это 20 должно было быть 30. Спасибо, что заметили это. Исправленный. – Jono

+1

Концепция называется «линейная интерполяция», но я хочу проверить; Ваши низкоприоритетные аргументы (30, 80) всегда положительны? – roganjosh

ответ

4

В дополнение к ответу Claris', эта функция работает для различных границ:

def fancyMap(array, low, high): 
    array = [int(numeric_string) for numeric_string in array] 
    minimum = min(array) 
    maximum = max(array) 

    diff = maximum - minimum 
    diffScale = high - low 

    return map (lambda x: int((int(x)-minimum)*(float(diffScale)/diff)+low), array) 
+0

Ваше использование 'int' не работает, оно масштабируется до 79, а не 80 – roganjosh

+1

Теперь это должно работать нормально. Он выполнял целочисленное деление с 'diffScale/diff' – Keiwan

+0

Вы также могли бы сделать' из __future__ import division', чтобы избежать целочисленного деления. – jpmc26

1

Что-то вроде этого?

dateList = ['1818', '1813', '1818', '1811', '1813'] 
print map (lambda x: (int(x)-1811)*(50.0/7)+30, dateList) 

или

print map (lambda x: int((int(x)-1811)*(50.0/7)+30), dateList) 
+0

Я хотел бы предложить вам динамически вытащить min и max и вычислить коэффициент масштабирования и смещение, а не жесткую кодировку. – jpmc26

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