2015-03-04 3 views
-4

Если у меня есть отсортированный массив числовых значений, таких как Double, Integer и Time, какова общая логика для поиска дополнения?Как найти дополнение к массиву?

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

+5

'если my_list == [1,3,5,7,10]: возвращение [2,4,6,8,9]' – iCodez

+1

Это очень запутанным, как вы получите + из любого числа, кроме от 10. – Katpoes

+0

Позвольте мне пояснить, как я могу перебирать список и находить недостающие компоненты? –

ответ

1

попробовать что-то вроде этого:

def complement(l, universe=None): 
    """ 
    Return the complement of a list of integers, as compared to 
    a given "universe" set. If no universe is specified, 
    consider the universe to be all integers between 
    the minimum and maximum values of the given list. 
    """ 
    if universe is not None: 
     universe = set(universe) 
    else: 
     universe = set(range(min(l), max(l)+1)) 
    return sorted(universe - set(l)) 

затем

l = [1,3,5,7,10] 
complement(l) 

выходы:

[2, 4, 6, 8, 9] 

Или вы можете указать свою собственную вселенную:

complement(l, range(12)) 

выходы:

[0, 2, 4, 6, 8, 9, 11] 
0

Вы можете найти комплимент двух списков, используя список. Здесь мы берем дополнение множества x с относительно множества y:

>>> x = [1, 3, 5, 7, 10] 
>>> y = [1, 2, 3, 4, 8, 9, 20] 
>>> z = [n for n in x if not n in y] 
>>> z 
[5, 7, 10] 
>>> 
0

Чтобы добавить еще один вариант - с использованием типа данных, который всегда полезно узнать о том, для этих типов операций.

a = set([1, 3, 5, 7, 10]) 
b = set(range(1, 11)) 
c = sorted(list(b.symmetric_difference(a))) 
print(c) 

[2, 4, 6, 8, 9] 
0
>>> nums = [1, 3, 5, 7, 10] 
>>> [n + ((n&1)*2-1) for n in nums] 
[2, 4, 6, 8, 9] 
+0

Мне интересно узнать причину downvoting, чтобы я мог улучшить свой ответ. – jamylak

+0

Я не являюсь нисходящим, но это пришло ко мне в очереди просмотра. Я предполагаю, что кому-то не понравился только ответ на код (как правило, чтобы заставить некоторых людей спуститься сюда - с 43k rep, я думаю, вы это знаете). Я думаю, здесь 'n & 1' немного загадочно для некоторых людей, поэтому downvoter, вероятно, нуждался в объяснении. –

0

Самый простой способ для перебора с самого начала своего списка к второму элементу. Set j, равный index + 1. В то время как j меньше следующего числа в вашем списке, добавьте его в свой список дополнений и увеличьте его.

# find the skipped numbers in a list sorted in ascending order 
def getSkippedNumbers (arr): 
    complement = [] 
    for i in xrange(0, len(arr) - 1): 
     j = arr[i] + 1 
     while j < arr[i + 1]: 
      complement.append(j) 
      j += 1 
    return complement 

test = [1, 3, 5, 7, 10] 
print getSkippedNumbers(test) # returns [2, 4, 6, 8, 9] 
Смежные вопросы