Форум сайта python.su
Мне нужно преобразовать массив таким образом что бы сначала шли все числа принадлежащие промежутку от a до b,включительно, а потом все остальные. Желательно без использования функций Numpy
import numpy as np x=np.array([8,34,-5,41,8,43,9,47,7,-4,8,37,11]) def preobraz(x): a=-5 b=8 for i in range(len(x)-1): for j in range(len(x)-1): if a<=x[i]<=b: buf=x[j] x[j]=x[j+1] x[j+1]=buf return x
Отредактировано Tolmavasya (Май 23, 2014 12:47:58)
Офлайн
l = [8, 34, -5, 41, 8, 43, 9, 47, 7, -4, 8, 37, 11] lrange = xrange(-5, 8 + 1) print filter(lambda x: x in lrange, l) + filter(lambda x: x not in lrange, l)
Офлайн
def change_lst(lst, x0, x1): n = len(lst) i = 0 while i < n: if not x0 <= lst[i] <= x1: lst.append(lst.pop(i)) n -= 1 else: i += 1 return lst
Офлайн
from random import randint from timeit import Timer lst = [randint(-100, 100) for x in xrange(1000)] def change_lst(lst, x0, x1): n = len(lst) i = 0 while i < n: if not x0 <= lst[i] <= x1: lst.append(lst.pop(i)) n -= 1 else: i += 1 def change_lst_1(l, x0, x1): lrange = xrange(x0, x1 + 1) filter(lambda x: x in lrange, l) + filter(lambda x: x not in lrange, l) print( Timer( 'change_lst(lst, -25, 25)', 'from __main__ import change_lst, lst', ).repeat(number=500) ) print( Timer( 'change_lst_1(lst, -25, 25)', 'from __main__ import change_lst_1, lst', ).repeat(number=500) )
[0.19870996475219727, 0.19606900215148926, 0.19738388061523438] [1.1597800254821777, 1.1518549919128418, 1.1524171829223633]
lst = [randint(-100, 100) for x in xrange(5000)] [1.9120218753814697, 1.8795349597930908, 1.8031980991363525] [5.685834169387817, 5.6973559856414795, 5.67763090133667]
lst = [randint(-100, 100) for x in xrange(10000)] [8.914979934692383, 8.927042007446289, 9.021567106246948] [11.451546907424927, 11.313754081726074, 11.619380950927734]
lst = [randint(-100, 100) for x in xrange(15000)] [18.895700931549072, 18.775031089782715, 18.790196895599365] [17.054412841796875, 17.187416076660156, 17.212937116622925]
lst = [randint(-100, 100) for x in xrange(20000)] [32.833192110061646, 32.811413049697876, 33.04986381530762] [23.030756950378418, 23.137761116027832, 22.968353033065796]
Офлайн