2015-03-20 3 views
2

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

locSet = [(62.5, 121.0), (62.50000762939453, 121.00001525878906), (63.0, 121.0),(63.000003814697266, 121.00001525878906), (144.0, 41.5)] 

Я хочу, чтобы сгруппировать их с диапазоном допуска +/- 3.

aFunc(locSet) 

которая возвращает

[(62.5, 121.0), (144.0, 41.5)] 

Я видел Identify groups of continuous numbers in a list но это для непрерывных чисел.

+1

Может быть несколько решений. Как вы будете группировать '[(10, 20), (12, 20), (14, 20)]'? – wim

ответ

0

Если я хорошо понял, вы ищете кортежи, значения которых отличается в абсолютной сумме, которая находится в пределах допуска: [0, 1, 2, 3]

Предполагая это, мое решение возвращает список списков, где каждый внутренний список содержит кортежи, которые удовлетворяют условию.

def aFunc(locSet): 
    # Sort the list. 
    locSet = sorted(locSet,key=lambda x: x[0]+x[1]) 

    toleranceRange = 3 
    resultLst = [] 
    for i in range(len(locSet)): 
     sum1 = locSet[i][0] + locSet[i][1] 
     tempLst = [locSet[i]] 
     for j in range(i+1,len(locSet)): 
      sum2 = locSet[j][0] + locSet[j][1] 
      if (abs(sum1-sum2) in range(toleranceRange+1)): 
       tempLst.append(locSet[j]) 

     if (len(tempLst) > 1): 
      for lst in resultLst: 
       if (list(set(tempLst) - set(lst)) == []): 
        # This solution is part of a previous solution. 
        # Doesn't include it. 
        break 
      else: 
       # Valid solution. 
       resultLst.append(tempLst) 

    return resultLst 

Вот два примера использования:

locSet1 = [(62.5, 121.0), (62.50000762939453, 121.00001525878906), (63.0, 121.0),(63.000003814697266, 121.00001525878906), (144.0, 41.5)] 
locSet2 = [(10, 20), (12, 20), (13, 20), (14, 20)] 

print aFunc(locSet1) 
[[(62.5, 121.0), (144.0, 41.5)]] 

print aFunc(locSet2) 
[[(10, 20), (12, 20), (13, 20)], [(12, 20), (13, 20), (14, 20)]] 

Я надеюсь, что было помочь.

+0

@ blazinazin215 Был ли мой ответ полезным? – JaviHerAr