2014-11-20 2 views
5

В Python 2.7, как я могу создать список по диапазону с фиксированным числом элементов, а не фиксированным шагом между каждым элементом?Создание диапазона с фиксированным числом элементов (длина)

>>> # Creating a range with a fixed step between elements is easy: 
>>> range(0, 10, 2) 
[0, 2, 4, 6, 8] 
>>> # I'm looking for something like this: 
>>> foo(0, 10, num_of_elements=4) 
[0.0, 2.5, 5, 7.5] 
+1

'range()' может генерировать целые числа. –

ответ

7

Я использую numpy для этого.

>>> import numpy as np 
>>> np.linspace(start=0, stop=7.5, num=4) 
array([ 0. , 2.5, 5. , 7.5]) 
>>> list(_) 
[0.0, 2.5, 5.0, 7.5] 
+0

Да! Это то, что я искал. Я использую 'numpy' постоянно, поэтому для меня лично это не проблема, что он не встроен. Люди, которые не всегда импортируют 'numpy', могут предпочесть ответ [Martijn Pieters] (http://stackoverflow.com/a/27043996/2071807). – LondonRob

6

Вы можете легко создать такой список со списком понимания:

def foo(start, stop, count): 
    step = (stop - start)/float(count) 
    return [start + i * step for i in xrange(count)] 

Это производит:

>>> foo(0, 10, 4) 
[0.0, 2.5, 5.0, 7.5] 
+0

Да, хотя, как только вы вычислили 'step', вы можете просто использовать' range (0, 10, step) ', правильно? – LondonRob

+1

@LondonRob: нет, потому что 'range()' работает только с целыми числами. –

2

itertools.count может работать с плавающей точкой:

>>> import itertools 
>>> def my_range(start,stop,count): 
...  step = (stop-start)/float(count) 
...  for x in itertools.count(start,step): 
...   if x < stop: 
...    yield x 
...   else:break 
... 
>>> [x for x in my_range(0,10,4)] 
[0, 2.5, 5.0, 7.5] 
0

Как насчет это:

>>> def foo(start=0, end=10, num_of_elements=4): 
...  if (end-start)/num_of_elements != float(end-start)/num_of_elements: 
...   end = float(end) 
...  while start < end: 
...   yield start 
...   start += end/num_of_elements 
...   
>>> list(foo(0, 10, 4)) 
[0, 2.5, 5.0, 7.5] 
>>> list(foo(0, 10, 3)) 
[0, 3.3333333333333335, 6.666666666666667] 
>>> list(foo(0, 20, 10)) 
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
>>> 

Он сохраняет ваши спецификации для того, чтобы первый элемент был целым числом, а остальные - поплавками. Но если вы дадите ему шаг, где элементы могут оставаться целыми, они будут.

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