2016-07-29 1 views
0

Я сделал простой код, чтобы найти наибольшее значение из различных списков номеровНайдите второе самое высокое значение из различных списков номеров

lists = [[1,-3,5,2,6,11,78,5,-345,-3,6,98,-5,0],[1,2,3,4,5,6,7,6,5,4,4],[-435,-64,-4,-6,-45,-8,-98,-7,-8],[32,45,56,554,12,33]] 
for w in lists: 
    lst = w 
    a = float ("-inf") 
    for x in range (0, len (lst)): 
     b = lst [x] 
     if (b > a): 
      a = b 
      c = x 
      z = lst 
print ("The list is:",z) 
print ("The highest value is: " , a) 
print ("The position is:", c+1) 

Out: 
The list is: [32, 45, 56, 554, 12, 33] 
The highest value is: 554 
The position is: 4 

Но как я знаю, второй, третий и так далее? ?

Я ищу что-то вроде этого:

Out: 
The list is: [1,-3,5,2,6,11,78,5,-345,-3,6,98,-5,0] 
The second highest value is: 98 
The position is: 12 
+2

Вы можете заказать его, а затем получить доступ к самому высокому, второй самому высокому, через 'ordered_list [-1], ordered_list [-2]' и т. д. –

+0

Возможный дубликат, http://stackoverflow.com/questions/33486058/python-how-to-find-the-second-highest-number-in-a-list – Rockybilly

+0

Поиск самого большого элемента 'kth' в массиве - это довольно интересная проблема. Сортировка списка - хорошая ставка, но есть 'O (n)' средние решения: http://stackoverflow.com/questions/251781/how-to-find-the-kth-largest-element-in-an -unsorted-array-of-length-n-in-on – dashiell

ответ

1
>>> lst = [1,-3,5,2,6,11,78,5,-345,-3,6,98,-5,0] 

>>> sorted(lst) 
[-345, -5, -3, -3, 0, 1, 2, 5, 5, 6, 6, 11, 78, 98] 
>>> 
>>> second_most = sorted(lst)[-2] 
>>> second_most 
78 
>>> 
>>> lst.index(78) 
6 
>>> 

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

+0

, но это не указывает местоположение индекса, откуда оно было. – Alexander

+0

Привет, спасибо за ответ, но я понял, что мой код не то, что мне нужно было сделать. Я отредактировал, чтобы показать, что я действительно после –

+0

, вы можете найти самые высокие, самые высокие и т. Д., Индексируя отсортированные (lst) [- 3] и т. Д. Затем возьмите это значение и используйте lst.index (значение) –

0

Вы можете использовать numpy для этого. Метод np.argsort возвращает массив numpy из индексов, который сортирует список.

>>> import numpy as np 
>>> list = [1,-3,5,2,6,11,78,5,-345,-3,6,98,-5,0] 
>>> inds = np.argsort(list) 
>>> print('The highest value is: {0}'.format(list[inds[-1]])) 
The highest value is: 98 
>>> print('Second highest value is: {0}'.format(list[inds[-2]])) 
Second highest value is: 78 
>>> print('Third highest value is: {0}'.format(list[inds[-3]])) 
Third highest value is: 11 

Если то, что вы на самом деле хотите, является вторым по величине абсолютное значение, то вы можете просто взять абсолютное значение списка с помощью np.abs загодя:

>>> import numpy as np 
>>> list = [1,-3,5,2,6,11,78,5,-345,-3,6,98,-5,0] 
>>> inds = np.argsort(np.abs(list)) 
>>> print('The highest absolute value is: {0}'.format(list[inds[-1]])) 
The highest absolute value is: -345 
>>> print('Second highest absolute value is: {0}'.format(list[inds[-2]])) 
Second highest absolute value is: 98 
>>> print('Third highest absolute value is: {0}'.format(list[inds[-3]])) 
Third highest absolute value is: 78 
+0

Но вывод I «Ищем 98 из другого списка [1, -3,5,2,6,11,78,5, -345, -3,6,98, -5,0] –

+0

@YaredJ. Я обновил его, чтобы использовать этот конкретный пример, но принцип тот же. Ключевым моментом в моем ответе является использование «np.argsort» для получения индексов каждого отсортированного элемента. –

0

Попробуйте этот подход, который отображает все позиции и рейтинг в словаре:

from operator import itemgetter 

lists = [[1,-3,5,2,6,11,78,5,-345,-3,6,98,-5,0], 
     [1,2,3,4,5,6,7,6,5,4,4], 
     [-435,-64,-4,-6,-45,-8,-98,-7,-8], 
     [32,45,56,554,12,33]] 

rank = 0 
mapping = {(rank, lst_no, pos): val 
       for lst_no, lst in enumerate(lists) 
       for pos, val in enumerate(lst)} 

value = float('nan') 
rank_incr = 0 
for (_, lst_no, pos), val in sorted(
         temp.items(), reverse=True, key=itemgetter(1)): 
    # The following section is to assign the same rank 
    # to repeated values, and continue counting thereafter. 
    if val != value:    
     value = val 
     rank += rank_incr 
     rank_incr = 1 
    else: 
     rank_incr += 1 
    # ----------------- 
    del mapping((0, lst_no, pos)) 
    mapping[(rank, lst_no, pos)] = val 

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

for (rank, lst_no, pos), val in sorted(mapping.items()): 
    print("Ranking No. {}".format(rank)) 
    print(" The value: {}".format(val)) 
    print(" The list No. {}, is: {}".format(lst_no, lists[lst_no])) 
    print(" The position is: {}".format(pos)) 
    print() 

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

  • Нет связанных вопросов^_^