Я не вижу, есть ли в моем списке повторяющиеся числа - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь сгенерировать 20 случайных чисел в моем списке.Далее я хочу посмотреть, есть ли в нем повторяющиеся числа.

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

import random

random_array=[]

def array():
  for i in range(0,20):
    random_element=random.randint(1,35)
    random_array.append(random_element)
  return random_array
print(array())

# function to order the list
def insertion_sort():
  for i in range(1,len(random_array)):
    while i>0 and random_array[i-1]>random_array[i]:
      random_array[i-1],random_array[i]=random_array[i],random_array[i-1]
      i=i-1
  return random_array
print(insertion_sort())

def verification():
  for i in random_array:
    insertion_sort()
    if i-1==i:
      return True
    else:
      return False
print(verification())

Моя программа всегда возвращает false независимо от созданного списка.

Ответы [ 5 ]

1 голос
/ 13 июня 2019

Проблемы в вашем коде:

  • Вы перебираете элементы, вычитаете их и сравниваете, вместо этого вы должны перебирать индексы и использовать их для сравнения последовательных элементов

  • Вы вызываете insertion_sort() внутри своего цикла for, я полагаю по ошибке

  • Вы хотите разорвать цикл for в первом найденном совпадении, ив конце верните логическое значение, которое сообщает, произошло ли совпадение

Таким образом, ваш код будет выглядеть как

def verification():
    #Flag to keep track of matches
    flag = False
    #Iterate over list via indexes
    for i in range(len(random_array)):
        #If consecutive elements match, set flag to true and break loop
        if random_array[i-1]==random_array[i]:
            flag = True
            break
    #Return flag value
    return flag
0 голосов
/ 13 июня 2019

Вы можете сделать это с помощью более короткого кода, используя itertools.Counter :

import random
from collections import Counter

# Generate a random array
random_array = [random.randint(1, 35) for _ in range(20)]


nums = [
    n  # A number
    for (n, count) in Counter(random_array).items()  # From countered items
    if count > 1  # If the count of this number is more than one
]
print(nums)
0 голосов
/ 13 июня 2019

ваш цикл в проверке определения (): завершается после первой итерации, потому что, если еще: возвращает False (он завершается)

используйте простой флаг:

import random

random_array=[]

def array():
  for i in range(0,20):
    random_element=random.randint(1,35)
    random_array.append(random_element)
  return random_array
print(array())

# function to order the list
def insertion_sort():
  for i in range(1,len(random_array)):
    while i>0 and random_array[i-1]>random_array[i]:
      random_array[i-1],random_array[i]=random_array[i],random_array[i-1]
      i=i-1
  return random_array
print(insertion_sort())

def verification():
  #for i in random_array:
  status = False # <----
  for i in range(len(random_array)-1): # <------
    insertion_sort()
    #if i-1==i:
    if random_array[i] == random_array[i+1]: # Iterate over list by indexes
      status = True
      break 
  return status
print(verification())
0 голосов
/ 13 июня 2019

Ваша функция проверки неверна. Вы сравниваете значение элемента i со значением элемента i - 1, что никогда не будет правдой. Попробуйте это:

insertion_sort()
for i in range(1,len(random_array - 1)):
    if random_arry[i] == random_array[i-1]:
        return True
return False  # If you get through every element without finding a match, return False

0 голосов
/ 13 июня 2019

У вас есть два варианта: Если вам не нужен порядок, вы можете использовать set, который является типом данных, который может иметь только уникальные элементы.Если вам нужно сохранить исходный порядок чисел, вам нужно использовать OrderedDict из collections

См. Этот стек: https://stackoverflow.com/a/7961393/11323304

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...