2017-02-13 3 views
0

Так что я пытаюсь найти третье по величине число/строку в списке. Это код, который я до сих поркак найти наибольшее число в списке

def big(inputString): 
    big1 = inputString[0] 
    big2 = inputString[0] 
    big3 = inputString[0] 
    for char in inputString: 
     if char > big1: 
      big1, big2,big3 = char,big1,big2 
     elif big1 > char > big2 > big3: 
      big3 = char 
    print('largest',big1,'second largest',big2,third largest,big3) 

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

big('abxztu') 
largest z second largest x third largest u 

но вывод, что я получаю

largest z second largest x third largest b 

Может ли кто-нибудь сказать мне, где ошибка в моем коде

+0

что если большой2> char> большой3? – Fallen

+0

Как вы определяете наибольшее число?Ваш код не соответствует номерам с более чем одной цифрой. – Sayse

+0

Почему бы вам не использовать 'sorted' и взять на себя наибольший,' third_largest, second_largest, most = sorted ('abxztu') [- 4: - 1] ' –

ответ

2

Вы не обрабатываете случай, когда big2> char> big 3.

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

s = sorted('abxztu') 
print s # ['a', 'b', 't', 'u', 'x', 'z'] 

Теперь распечатайте их с хвоста или, если хотите, перевернуть и напечатать их с головы.

Даже лучший ответ, предложенный @Chris_Rands, заключается в использовании heapq.nlargest.

print heapq.nlargest(3, 'abxztu') #['z', 'x', 'u'] 
+2

' heapq.nlargest' лучше, чем отсортировано для этого –

+0

@Chris_Rands Я согласен. Это решение заслуживает ответа вместо комментария :) – Fallen

+0

Предлагал вам добавить его к вашему ответу :) –

1

Вы могли бы просто сделать это:

def big(inputString): 
    l = sorted(list(inputString)) #Turning the input into a list and sorting it 
    l = l[::-1] #Reversing the list 
    print(l[0],l[1],l[2]) #Printing out the first three element of the list 

Это пример тестового прогона:

>>> big("abc") 
c b a 

Edit 1

Другой пример теста :

>>> big("helloworld") 
w r o 
+0

Ваш тестовый пример на самом деле не показывает многого, возможно, лучше использовать тест, который по крайней мере имеет 4 элемента, и что просто не нужно обращать вспять без сортировки, попробуйте ввести OPs: ''abxztu'' –

+1

Thx для комментария Nick, теперь я отредактировал свой ответ, добавив пример использования более сложной строки – Ashiro

1

Вы можете использовать встроенный sorted, чтобы отсортировать список. sorted принимает параметр reverse (boolean), поэтому вы можете отсортировать список по убыванию.

Вы можете передать строку до sorted и сортировать отдельные символы в списке.

Чтобы получить третий, или второй или самый большой элемент в списке, просто отсортируйте список в порядке убывания, затем вызовите этот элемент, например. obj[0] для наибольшего элемента, obj[1] для второй по величине и т.д.

Давайте соберем вместе:

""" Returns nth largest object from string or list """ 
def nth_largest(obj, n=1): 
    obj = sorted(obj, reverse=True) 
    return obj[n-1] 

>>> nth_largest('abxztu', 3) 
'u' 
+0

@TobySpeight Мой плохой, я понял это было самоочевидным в контексте, но, как вы говорите, лучше обеспечить окружающий контекст в любом случае для будущих поисковиков. Обновлен мой ответ. – daveruinseverything

0

одно условие отсутствует, когда символ меньше big1 и больше Big2

кодекса :

def big(inputString): 
    big1 = inputString[0] 
    big2 = inputString[0] 
    big3 = inputString[0] 

    for char in inputString: 
     if char > big1: 
      big1, big2, big3 = char, big1, big2 
     elif big1 > char > big2 > big3: 
      big3 = char 
     elif big3 < char <big1> big2: 
      big3 = char 

    print('largest',big1,'second largest',big2,'third largest',big3) 
Смежные вопросы