2015-09-29 3 views
0

Учитывая последовательность, мне было интересно, как найти дубликаты, используя ТОЛЬКО для циклов (без импортированных модулей, функций сортировки и т. Д.) В Python. Вот мой следующий код, который включает в себя вложенным для петель до сих пор:Дублирует в последовательности, используя ТОЛЬКО для циклов в Python

def has_duplicates(list): 
    x = 0 
    ans = False 
    for i in range(len(list)): 
     index = i 
     for object in list: 
      x = object 
     if list[i] == x: 
      ans = True 
      break 
    return ans 

Я действительно не знаю, что код для внутреннего цикла ... Есть вложенные циклы, даже необходимые, чтобы найти дубликаты последовательности?

Примеры следующих выходов:

list = [10, 11, 12, 13, 14, 15] 
print(ans) 
False 
list = "Hello" 
print(ans) 
True 
+0

Вам нужно вызвать функцию, по крайней мере, и использовать возвращаемое значение. –

+2

Вам разрешено использовать 'set'? –

+0

Нет комплектов. – DaveNOTDavid

ответ

1

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

Чтобы получить подсписок, начиная с индекса 0 uptill текущего индекса мы используем slice[:] операции в списке, и проверить, если текущий элемент существует в этом подсписке, мы используем оператор in.

Вы можете сделать следующее:

In [1]: def has_duplicates(my_list): 
    ...:  for index in range(len(my_list)): 
    ...:   if index!=0: # check only from 2nd element onwards 
    ...:    item = my_list[index] # get the current item 
    ...:    if item in my_list[:index]: # check if current item is in the beginning of the list uptill the current element 
    ...:     return True # duplicate exist 
    ...:  return False # duplicate does not exist 
    ...: 

In [2]: has_duplicates([1,2,3,4]) 
Out[2]: False 

In [3]: has_duplicates([1,2,3,4,4]) 
Out[3]: True 

In [4]: has_duplicates([1,1,2,3,4,4]) 
Out[4]: True 
0

Возьмите кусочки ООН-итерация значений:

def has_duplicates(values): 
    for index, value in enumerate(values, start=1): 
     for other_value in values[index:]: 
      if value == other_value: 
       return True 
    return False 

Если вы можете использовать наборы:

def has_duplicates(values): 
    return len(values) > len(set(values)) 
+0

ОП указывает, что им запрещено использовать 'set' в своих комментариях. –

+0

@ShotgunNinja Ну, это лопнуло мой пузырь. –

1

Вы могли бы сделать гораздо более эффективным, сравнение опережения для каждого элемента; это исключает избыточные сравнения во всем списке, только сравнивая каждый элемент с теми, которые следуют за ним. Я не программист на Python, поэтому я только предполагаю, что это сработает; это, вероятно, наименее идиоматическое решение этой проблемы (что означает, что у Python, вероятно, есть более красивые способы обработки этого, но он должен работать просто отлично).

def has_duplicates(list): 
    for i in range(len(list)): 
     for j in range(i+1, len(list)): 
      if list[i] == list[j]: 
       return True 
    return False 
+0

Поскольку вы прокомментировали временную сложность в другом месте, я бы просто хотел указать, что это тоже «O (n^2)», так как это быстрее, чем наивное решение с постоянным коэффициентом ~ 2. Решение _efficient_ использует хеширование. – tzaman

+0

@tzaman Правда, это не намного эффективнее; это все равно такая же сложность, но она вырезает много избытка * почти * до точки n nnn n. Мне бы хотелось увидеть эффективное решение; вы могли бы написать это как ответ? –

+0

Нет, это не работает. Ваш путь сокращает примерно половину работы; 'O (n^2/2)' все еще невероятно далека от 'n lg n'. Весь смысл отбрасывания постоянных факторов в нотации Big-O заключается в том, что они более или менее неактуальны по мере роста 'n'. Ваше решение по-прежнему очень прочно находится в ведре 'O (n^2)'. Более эффективный будет использовать 'set', поэтому он не допускается по критериям OP, но @Peter Wood близок. – tzaman

0

Как есть некоторые предложения с точки зрения производительности, мое решение с точки зрения удобочитаемости. Лучше использовать enumerate для захвата index.

def has_duplicates(list): 

    for index,value in enumerate(list): 
     for index2,value2 in enumerate(list): 
      if value==value2 and index!=index2: 
       return True 


    return False 

print has_duplicates("Hello") 
print has_duplicates([10, 11, 12, 13, 14, 15]) 

Выход:

True 
False 
+1

Это немного неэффективно, на 'O (N^2)' .... –

+0

@ShotgunNinja, вне курса, я написал его выше. Я написал его, чтобы сделать его максимально простым. –

+0

Но да, это довольно умный и идиоматический способ решить эту проблему. –

Смежные вопросы