2012-04-02 14 views
5

Dato 3 numeri, ho bisogno di trovare quale numero si trova tra gli altri due.come trovare il numero medio in python

ie, dato 3,5,2 Ho bisogno di 3 essere restituito.

Ho provato a implementarlo passando attraverso tutti e tre e utilizzando le condizioni if ​​else per verificare se ognuna è tra gli altri due.Ma questo sembra un modo ingenuo per farlo. C'è un modo migliore?

+2

È davvero _always_ tre? – alan

+3

Quale risultato ti aspetti per '[1,1,2]'? –

+1

'ordinato ([3,5,2]) [1]' – tMC

risposta

17

Inseriscili in un elenco, ordinali, prendi quello centrale.

+8

+1 per non dare il codice :-) – Simon

+1

mio male! avrei dovuto pensarlo! grazie mille – damon

+2

Sapevo che questo sarebbe successo ... – jamylak

4

Si potrebbe fare

numbers = [3, 5, 2] 
sorted(numbers)[1] 
+1

Anche se questo sarebbe completamente corretto, id odia solo avere un '1' hard codificato – jamylak

11
>>> x = [1,3,2] 
>>> sorted(x)[len(x) // 2] 
2 
3

quello che vuoi è il mediana. È possibile utilizzare questo codice qui sotto per qualsiasi numero di numeri:

import numpy 
numbers = [3,5,2] 
median = numpy.median(numbers) 

per una soluzione personalizzata è possibile visitare questo page.

+1

Nel caso dell'OP non penso che sia pronto per usare qualcosa come Numpy. – jamylak

+1

Non proprio. L'OP vuole il numero medio in una lista. Certo, questo è un po 'ambiguo per una lista con un numero pari di elementi. numpy.median ([3,5,2]) = 3.0 (float!). numpy.median ([3,5,2,1]) = 2,5, non è affatto quello che l'OP ha in mente! – user90855

3

Questa è una implementazione O (n) della mediana utilizzando le distribuzioni cumulative. È più veloce dell'ordinamento, perché l'ordinamento è O (ln (n) * n).

def median(data): 
    frequency_distribution = {i:0 for i in data} 
    for x in data: 
     frequency_distribution[x] =+ 1 
    cumulative_sum = 0 
    for i in data: 
     cumulative_sum += frequency_distribution[i] 
     if (cumulative_sum > int(len(data)*0.5)): 
      return i 
+0

soluzione intelligente a una domanda diversa, perché qui abbiamo solo elementi '3' ... – jamylak

+0

' median ([8, 1, 4]) 'mi dà 1 !! –

8

Il modo più veloce ovvia per tre numeri

def mean3(a, b, c): 
    if a <= b <= c or c <= b <= a: 
     return b 
    elif b <= a <= c or c <= a <= b: 
     return a 
    else: 
     return c 
+0

'mean3 (3,5,2)' darà 2 invece di 3? – damon

+0

@damon grazie per averlo notato. Fisso. –

+0

+1 per l'operazione relazionale contigua - raramente visto :) – Barun

1

controllare questo (Lista Supponiamo che già ordinato):

def median(list): 
    ceil_half_len = math.ceil((len(list)-1)/2) # get the ceil middle element's index 
    floor_half_len = math.floor((len(list)-1)/2) # get the floor middle element 's index' 
    return (list[ceil_half_len] + list[floor_half_len])/2 
+1

Questo restituisce 'TypeError: gli indici di lista devono essere interi, non float'. È necessario avvolgere math.ceil e math.floor con int() – portforwardpodcast

0

Qui è il mio tentativo utilizza una versione più divinatorio

def median(a): 
    sorted_a = sorted(a) 
    if len(a) % 2 == 0: 
     median = sum(sorted_a[(len(a)//2)-1:(len(a)//2)+1])/2. 
    else: 
     median = sorted_a[(len(a)-1)//2] 

>>> x = [64630, 11735, 14216, 99233, 14470, 4978, 73429, 38120, 51135, 67060] 
>>> median(x) 
>>> 44627.5 
>>> y = [1, 2, 3] 
>>> median(y) 
>>> 2 
0

Se si desidera evitare l'ordinamento, si può fare:

def find_median(x): 
    return sum(x) - max(x) - min(x) 
Problemi correlati