2014-01-08 3 views
1

Дано:Get x1, x2 при условии, что х принадлежит [x1, x2]

xvalues = [0.0, 1829.0, 3658.0, 5487.0] 

и

nodesF = [[1, 0, 0, 0], [2, 0.5, 0, 0], [3, 5487, 0, 0]] 

Я хочу, чтобы петля над nodesF и вернуть x1 и x2 ценности, которые каждый x из nodesF лежат между, то есть x относится к [x1,x2] с x1<x2.

Мой код:

 for nodeID, x, y, z in nodesF: 
     x2= min(value for value in xvalues if value >= x) 
     x1= max(value for value in xvalues if value <= x) 
     if x1==x2: 
      x1=None 
      x2=None 
      x2= min(value for value in xvalues if value > x) 
      x1= max(value for value in xvalues if value <= x) 
      if x2==None or x2<=x1: 
       x2= min(value for value in xvalues if value >= x) 
       x1= max(value for value in xvalues if value < x) 
      elif x1==None or x2<=x1: 
       print "Error" 

При х = 5487 я получаю:

x2= min(value for value in xvalues if value > x) ValueError: min() arg is an empty sequence.

Так что мой вопрос, как получить пройти эту ошибку? если бы я мог просто установить x2=None, когда min() пуст, все будет в порядке! Благодаря!

ответ

2

Вы находитесь на правильном пути, но вы должны сделать чек список самостоятельно:

valid_values = [value for value in xvalues if value > x] #changed >= by > 
if valid_values: 
    x2 = min(valid_values) 
else: 
    x2 = None 

Или вы могли бы поймать ошибку после факта:

try: 
    x2 = min(value for value in xvalues if value > x) #changed >= by > 
except ValueError: 
    x2 = None 
0

Так две строки могут показаться немного лаконична, но я надеюсь, вам понравится:

r = zip([float('-inf')] + xvalues, xvalues + [float('inf')]) 

, которая производит это:

In [104]: print r 
Out[104]: [(-inf, 0.0), (0.0, 1829.0), (1829.0, 3658.0), (3658.0, 5487.0), (5487.0, inf)] 

Тогда получите ваши диапазоны, как это:

[[filter(lambda l: l[0] < n <= l[1], r)[0] for n in m] for m in nodesF] 

, которая производит это:

Out[102]: 
[[(0.0, 1829.0), (-inf, 0.0), (-inf, 0.0), (-inf, 0.0)], 
[(0.0, 1829.0), (0.0, 1829.0), (-inf, 0.0), (-inf, 0.0)], 
[(0.0, 1829.0), (3658.0, 5487.0), (-inf, 0.0), (-inf, 0.0)]] 
Смежные вопросы