Python - найти наибольшее 2 из 3 чисел БЕЗ использования max () - PullRequest
0 голосов
/ 26 февраля 2012

Я ищу ответ на тот же вопрос, найденный здесь:

Python - Найти наибольшее число в наборе чисел

Однако я бы хотелпостроить свою собственную программу вместо использования встроенной функции max().Это то, что у меня есть сейчас, но выдает ошибку, я думаю, из-за переменной области видимости.

def two_of_three(a, b, c):
    if a>=b:
        x=a
    else:
        x=b
    if b>=c:
        y=b 
    else:
        y=c
    if a>=c:
        x=a
    else:
        x=c
    return x**x+y**y

assert two_of_three(3,4,5)==41
assert two_of_three(0,1,2)==5
assert two_of_three(9,21,89)==8362

Вот ошибка, которую я получаю:

Traceback (most recent call last):
File "python_hw1.py", line 32, in <module>
assert two_of_three(3,4,5)==41
AssertionError

Ответы [ 7 ]

2 голосов
/ 26 февраля 2012

В Python ** означает to the power of. Вы, наверное, ищете return x**2 + y**2

1 голос
/ 26 февраля 2012

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

def two_of_three(a, b, c):
    if a>=b:
        x=a
    else:
        x=b
    if b>=c:
        y=b 
    else:
        y=c
    if a>=c:
        x=a
    else:
        x=c
    print x, y

>>> two_of_three(3,4,5)
#5 5

update

Я не проверял это, потому что я обновляюс моего телефона, но как насчет чего-то подобного?

vals = [3,4,5]
twoLargest = sorted(vals)[-2:]

Пусть функция сортировки естественным образом поместит самые большие в конец и возьмет последние два?

def biggestTwo(*args):
    return sorted(args)[-2:]
1 голос
/ 26 февраля 2012

Sol.1

def two_biggest(a, b, c):
    if a>=b>=c:
        print a, b, 'are the biggest two'
    elif b>=c>=a:
        print b, c, 'are the biggest two'
    else:
        print c, a, 'are the biggest two'

Sol.2

def two_biggest(a, b, c):
    nums = set([a, b, c])
    smallest = min(nums) # not max (trollface :P)
    nums.remove(smallest)
    print "the two largest numbers are", ' and '.join(map(str, nums))
0 голосов
/ 19 ноября 2015
l=[2,3,8,5,4]
l.sort()
l[-1]
8
0 голосов
/ 27 февраля 2013

Мое решение следующее:

def two_of_three(a, b, c):
    """Return x**2 + y**2, where x and y are the two largest of a, b, c."""
    return sum( map( lambda x: x**2, ( (a, b) if (a>=b>=c) else ((b, c) if (b>= c>=a) else (a, c))) ) )
0 голосов
/ 26 февраля 2012

Если проблема не связана с функцией bultin max, напишите свою собственную:

def mymax(l):
    x=float("-inf")
    for i in l:
       if i>x: x=i
    return x 

Если вам нужен список из n самых больших значений в списке, вы также можете написать свое собственное из них:

def nmax(pl,n=1):
    r,l=[],[]
    for e in pl:
        l.append(e)
    for x in range(0,n):
        max_found=float("-inf")
        for i, v in enumerate(l):
            if v>max_found: 
                max_found=v
                max_index=i

        r.append(max_found)
        del l[max_index]

    return r   

Проверьте это:

>>> import random
>>> rl=random.sample(range(1000),10)     
>>> print rl
[183, 456, 688, 263, 452, 613, 789, 682, 589, 493]        
>>> print nmax(rl,2)
[789, 688]

Или, если вам разрешено встроенное sorted, вы можете сделать это в одну строку:

>>> sorted(rl)[-2:]
[789, 688]
0 голосов
/ 26 февраля 2012

Вы можете попробовать использовать списочные выражения, если вам нужны самые большие числа (не имена переменных):

In : (a,b,c)
Out: (7, 3, 8)

In : [x for x in (a,b,c) if (x > a) | (x > b) | ( x > c)]
Out: [7, 8]

Вам придется настроить это в зависимости от того, какой результат вы хотите получить, когда два илибольше чисел равны (например, 7,7,9)

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