2015-11-01 18 views
5

Dall'esperimento ho riferito che, in caso di parità, le scelte di python in base all'ordine (ad esempio l'elemento che compare per primo in una lista) C'è un modo, dove nel caso di un pareggio posso scegliere un oggetto a caso, in modo che non sia deterministico e basato sull'ordine?Scegliere un massimo casuale in caso di parità?

ad es.

l = [ ([1], 10) , ([2], 3), ([3], 9), ([4], 10)] 
max(l, key=lambda x: x[1]) 

ogni esecuzione di questo, potrebbe o ritorno ([4], 10) o ([1], 10) e non sempre ([1], 10)

+0

non credo che si può farlo direttamente (cioè, dicono 'max 'per farlo in modo casuale) ma puoi fare un' max' seguito da un 'filter' seguito da' random.choice'. – 5gon12eder

risposta

3

Si avrebbe bisogno di trovare tutto il massimo prima poi scegliere uno a caso:

from operator import itemgetter 
from random import choice 

l = [([1], 10) , ([2], 3), ([3], 9), ([4], 10)] 

mx = max(l, key=itemgetter(1)) 

all_maxes = [ele for ele in l if ele[1] == mx[1]] 

print(choice(all_maxes)) 
5

mischiare le lista prima di prendere il massimo:

import random 
random.shuffle(l) 
3

si potrebbe aggiungere al casualità ittle per il valore della chiave:

max(l, key=lambda x: x[1] + random.random()) 

o più in generale, nel caso in cui le chiavi non sono solo numeri interi:

max(l, key=lambda x: (x[1], random.random())) 
+1

Ciò potrebbe (in generale) causare un valore massimo per un articolo non massimo. – chepner

+0

come potrebbe causare un valore massimo per un articolo non massimo? Ho appena eseguito più iterazioni e in ogni iterazione il massimo sembra essere vero – user

+1

@user, .7 viene aggiunto a 2.5 e .1 viene aggiunto a 3, cosa verrà restituito come massimo? Va bene con numeri interi ma come ha detto chepner in generale non è un buon approccio –

Problemi correlati