2016-07-29 7 views
0

machte ich einen einfachen Code den höchsten Wert aus verschiedenen Listen von Zahlenden zweithöchsten Wert finden Sie verschiedene Listen von Zahlen

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 

Aber wie kann ich wissen, die zweite, die dritte und so weiter zu finden? ?

Ich bin auf der Suche nach so etwas wie folgt aus:

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

Sie können es bestellen und dann die höchste Zugriff zweithöchste, durch 'ordered_list [-1], ordered_list [-2]' usw. –

+0

möglich duplizieren, http://stackoverflow.com/questions/33486058/python-how-to-find-the-second-highest-number-in-a-list – Rockybilly

+0

Das 'kth' größte Element in einem Array zu finden ist a ziemlich interessantes Problem. Das Sortieren der Liste ist eine gute Wette, aber es gibt "O (n)" durchschnittliche Falllösungen: http://stackoverflow.com/questions/251781/how-to-find-the-kth-largest-element-in-an -unsorted-Array-of-length-n-in-on – dashiell

Antwort

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 
>>> 

Sie die Liste sortieren können, dann nehmen Sie die zweite zum letzten Wert an zweiter Stelle in der Liste am meisten zu bekommen

+0

aber das bietet nicht den Index Speicherort von wo es kam. – Alexander

+0

Hallo Joel, danke für die Antwort, aber ich erkannte, dass mein Code nicht das war, was ich tun musste. Ich habe bearbeitet, um zu zeigen, was ich wirklich nach –

+0

kann Sie finden, höchste, zweithöchste usw. durch Indexierung sortiert (lst) [- 3], etc. Dann nehmen Sie diesen Wert und verwenden lst.index (Wert) –

0

Sie verwenden können numpy, dies zu tun. Die np.argsort-Methode gibt ein numpy Array der Indizes zurück, die die Liste sortieren würden.

>>> 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 

Wenn das, was Sie wirklich wollen, der zweithöchste Absolutwert, dann kann man einfach den absoluten Wert der Liste np.abs vor der Zeit mit:

>>> 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

Aber die Ausgabe I Bin auf der Suche nach ist 98 aus der anderen Liste [1, -3,5,2,6,11,78,5, -345, -3,6,98, -5,0] –

+0

@YaredJ. Ich habe es aktualisiert, um dieses spezifische Beispiel zu verwenden, aber das Prinzip ist das gleiche. Der Schlüsselpunkt in meiner Antwort ist die Verwendung von 'np.argsort', um die Indizes jedes sortierten Elements zu erhalten. –

0

versuchen, diesen Ansatz, dass ordnet alle Positionen und Rangfolgen in einem Wörterbuch zu:

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 

Sie können auf alle Werte aus diesem Wörterbuch zugreifen Kartierung. Es verfügt über alle Informationen, die Sie brauchen: die Tasten sind Tupel von (Rang, Liste nicht, Position) und die Werte sind die einzelnen Werte

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()