Поиск недостающих чисел с помощью python

#python

#python

Вопрос:

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

Индекс, имя, дюймы

1 Иоанна 67

2 ?, ?

3 Ральф 75

4 ?, ?

5 Грегг 79

Правило заключается в том, что люди перечислены от самого низкого до самого высокого роста. Таким образом, # 2 должно быть равно или больше # 1 и равно или меньше # 3. Просто глядя на это, я могу решить это без кода.

# 2 имеет высоту от 67 до 75 дюймов

# 4 имеет высоту от 75 до 79 дюймов

Если два дополнительных имени и высоты были Мэтт (79) и Гарри (68) Я могу решить проблему, поскольку последовательность — это Джон, Гарри, Ральф, Мэтт, Грегг. Я думаю, что я действительно пытаюсь спросить, вписывается ли Гарри в какой-либо из возможных диапазонов?

Но для новичка это сложно кодировать, потому что иногда вам присваивается значение 1, 2, 3, и вам нужно решить для 4 и 5.

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

 Sarah = 64 
Harry = 68
Matt = 79
name_list = [[1, John, 67], [3, Ralph, 75], [5, Gregg, 79]]




  

Ответ №1:

Мне нравится всегда думать обо всех возможных случаях, а не только о приведенных, поскольку правильное решение должно работать правильно, независимо от того, какие данные. Я понял, что у вас будет куча людей, которых вы знаете, какого они роста, и некоторые, которых по какой-то причине вы вроде / вроде знаете, потому что вы знаете, что их рост находится между двумя людьми, чей рост вы знаете. Но нет никаких оснований ожидать, что у вас всегда будет отсутствующий человек между каждой парой высот, которые вы знаете. Таким образом, вы должны представлять свои неизвестные в своих данных, а также свои известные, чтобы предотвратить ложные срабатывания. Высота пропавшего человека равна 0.

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

Вот все мое решение, включая набор тестов, которые, как я полагаю, обрабатывают все случаи:

 def could_be_missing_person(knowns, person):
    person_age = person[1]
    for i in range(len(knowns)):
        if knowns[i][1] == 0: # Is this an entry for a missing person?
            if i == 0 and person_age < knowns[i 1][1]: # height below all known heights
                return True
            elif i == len(knowns) - 1 and person_age > knowns[i-1][1]: # height above all known heights
                return True
            if knowns[i - 1][1] < person_age < knowns[i   1][1]:
                return True
    return False

def test(knowns, person):
    r = could_be_missing_person(knowns, person)
    print(person, ": ", r, " <- A possible missing person!" if r else "")
    if person[2] != r:
        print("   WRONG!!!")

knowns = [["John", 67], ["", 0], ["Stan", 73], ["Ralph", 75], ["", 0], ["Gregg", 75],["Jeremy", 79], ["", 0]]

testers = [("Sarah", 64, False),
           ("Harry", 67, False),
           ("Harry", 68, True),
           ("Matt", 74, False),
           ("Richard", 75, False),
           ("Ronald", 76, False),
           ("Ronald", 78, False),
           ("Jimmy", 80, True),
           ("Jimmy", 85, True),
           ]

for p in testers:
    test(knowns, p)
  

Результат:

 ('Sarah', 64, False) :  False 
('Harry', 67, False) :  False 
('Harry', 68, True) :  True  <- A possible missing person!
('Matt', 74, False) :  False 
('Richard', 75, False) :  False 
('Ronald', 76, False) :  False 
('Ronald', 78, False) :  False 
('Jimmy', 80, True) :  True  <- A possible missing person!
('Jimmy', 85, True) :  True  <- A possible missing person!
  

Мне было скучно, и поэтому мне было весело с этим. Мне нравится, что вы программируете для развлечения. Я надеюсь, что это улучшило ваш опыт!

Комментарии:

1. Это потрясающе, хотя я все еще работаю с помощью функции could_be_missing_person, чтобы понять, что вы сделали. Хотя я думаю, что это поможет мне двигаться в правильном направлении (спасибо!), Иногда я получаю людей, отличных от # 1, # 3, # 5. Например, что, если у нас есть Рэнди 75, Ральф 76, Эрик 77 в качестве известных. Но вопрос указывает, что они являются # 3, # 4 и # 5 в последовательности. Среди тестировщиков: Сьюзи 57 лет, Синди 79 лет, Алисия 72 года. Я знаю, что # 1 Сьюзи, # 2 Алисия, # 3 Рэнд, # 4 Ральф, # 5 Эрик и Синди являются ложными, поскольку я решал для # 1 и # 2. Но это действительно потрясающе. Спасибо за помощь!

2. Привет! Я рад, что вам это нравится. Я был бы рад обсудить это с вами. Я старожил в плане программирования, и это было моим хобби, когда я начал в 16 или около того. Поэтому мне нравится слышать, как кто-то говорит, что это его хобби… что это просто для развлечения.

3. Продумать логику было для меня непросто. Потребовалось некоторое реальное мышление, чтобы правильно выполнить два конечных условия. У меня была цель во всем этом. Я хотел дать вам еще кое-что для размышления.

Ответ №2:

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

 >>> name_list = [["John", 67], ["Ralph", 75], ["Gregg", 79]]    
>>> name_list.append(["Harry", 68])
>>> name_list.sort(key= lambda x: x[1]) 
>>> name_list
[['John', 67], ['Harry', 68], ['Ralph', 75], ['Gregg', 79]]

>>> for idx, obj in enumerate(name_list, 1):
...      print(idx, *obj)
... 
1 John 67
2 Harry 68
3 Ralph 75
4 Gregg 79
  

Ответ №3:

сначала вы получаете список, который выглядит как [(John,67),(Ralph,75),(Gregg,79),(Harry,68),(Matt,79)]

затем вы сортируете этот список с помощью ключа параметра:

 list.sort(key=lambda _: _[1])
  

У вас будет что-то вроде:
(John,67),(Harry,68),(Ralph,75),(Gregg,79),(Matt,79)]

Я думаю, что это сделано!

Ответ №4:

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

 def insert(list, new_person):
    height = new_person[1]
    for i in range(len(list)):
        if list[i][1] > height:
            break
    new_list = list[:i]   [new_person]   list[i:]
    return new_list


sorted_list = [["John", 67], ["Ralph", 75], ["Gregg", 79]]
new_people = [["Sarah", 64], ["Harry", 68], ["Matt", 79]]
updated_list = sorted_list

for person in new_people:
    updated_list = insert(updated_list, person)

print(updated_list)