2015-09-25 2 views
0

В двух следующих спискахИспользование разрез`ать объединить числа в двух списках

l1 = [10, 33, 50, 67] 
l2 = [7, 16, 29, 55] 

цель состоит в том, чтобы объединить близкие номера в Словаре, и комбинации должны остановиться, как только он достигает последнего элемента в секунду список, так что в этом случае, если есть элементы не объединены в первом списке, эти элементы не будут рассматриваться, поэтому выход из вышеперечисленных списков будет

10 -> 7 
33 -> 29 
50 -> 55 
67 ->--- # in this case because the last n. in the first list(55) is identified, so the n.67 will be zero 

этот код дает следующий вывод

for s in l1: 
    ind = bisect(l2, s, hi=len(l2) - 1) 
    ind -= abs(l2[ind-1] - s) < l2[ind] - s 
    print("{} -> {}".format(s, l2[ind])) 

выход

10 -> 7 
33 -> 29 
50 -> 55 
67 -> 55 ### here is the error, so here will be: 67 -> --, because, 55 is identified in the previous items. 

Заявление

if ind == len(l2) - 1: 
    break 

дает этот выход

10 -> 7 
33 -> 29 

Может кто-то помочь?

+0

'hi = len (l2) - 1' является избыточным, поскольку это значение по умолчанию для этого аргумента. –

+0

У вас будет такая же проблема с '[10, 33, 34, 50]', только '33' и' 34' будут отображаться на '29'. Что должно произойти в этом случае? –

+0

Вы уже сказали, как это решить; вы говорите, что * комбинация должна остановиться, как только она достигнет последнего элемента во втором списке *. Поэтому просто проверьте 'if ind == len (l2) - 1: break', чтобы закончить цикл. –

ответ

1

Если все, что вам нужно, чтобы завершить цикл, когда последний индекс l2 достигается, а затем просто использовать break, когда это условие выполнено:

for s in l1: 
    ind = bisect(l2, s, hi=len(l2) - 1) 
    ind -= abs(l2[ind-1] - s) < l2[ind] - s 
    print("{} -> {}".format(s, l2[ind])) 
    if ind == len(l2) - 1: break 

Это производит вывод, который вы желаете для ввода пробы:

>>> for s in l1: 
...  ind = bisect(l2, s, hi=len(l2) - 1) 
...  ind -= abs(l2[ind-1] - s) < l2[ind] - s 
...  print("{} -> {}".format(s, l2[ind])) 
...  if ind == len(l2) - 1: break 
... 
10 -> 7 
33 -> 29 
50 -> 55 
Смежные вопросы