2011-02-10 25 views
7

Ho un problema per ottenere il valore più alto in un elenco dinamico di liste di tuple.
Il grado di Lista si presenta così:Valore massimo in un elenco di liste di tuple

adymlist = [[('name1',1)],[('name2',2),('name3',1), ...('name10', 20)], ...,[('name m',int),..]] 

Ora scorrere l'elenco per ottenere il massimo valore (intero):

total = {} 
y=0 
while y < len(adymlist): 
    if len(adymlist) == 1: 
     #has the List only 1 Element -> save it in total 
     total[adymlist[y][0][0]] = adymlist[y][0][1] 
     y += 1 
    else: 
     # here is the problem 
     # iterate through each lists to get the highest Value 
     # and you dont know how long this list can be 
     # safe the highest Value in total f.e. total = {'name1':1,'name10':20, ..} 

Ho provato un sacco per ottenere il massimo valore, ma ho trovato nessuna conclusione al mio problema. So che devo passare in rassegna ogni Tupla nella Lista e confrontarla con la prossima, ma non so come codificarla corretta.

Inoltre, posso utilizzare la funzione max() ma non funziona con stringhe e numeri interi. f.e. a = [ ('a',5),('z',1)] -> il risultato è max(a) ---> ('z',1) obv 5> 1 ma z> a, quindi ho tentato di espandere la funzione max con max(a, key=int) ma ottengo un errore di tipo.

spera che possiate capire quello che voglio ;-)

UPDATE

Grazie finora.

Se uso itertools.chain(*adymlist) e max(flatlist, key=lambda x: x[1])
mi metterò un'eccezione come: max_word = max (flatlist, key = lambda x: x [1]) TypeError: oggetto 'int' è unsubscriptable

ma se io utilizzare itertools.chain(adymlist) funziona correttamente. Ma non so come riassumere tutti gli interi da ogni tupla della lista. Ho bisogno del tuo aiuto per capirlo.

In caso contrario, ho scritto una soluzione alternativa per itertools.chain(*adymlist) per ottenere la somma di tutti gli interi e il numero intero più alto in tale elenco.

chain = itertools.chain(*adymlist) 
flatlist = list(chain) 
# flatlist = string, integer, string, integer, ... 
max_count = max(flatlist[1:len(flatlist):2]) 
total_count = sum(flatlist[1:len(flatlist):2]) 
# index of highest integer 
idx = flatlist.index(next((n for n in flatlist if n == max_count))) 
max_keyword = flatlist[idx-1] 

Si fa ancora quello che voglio, ma non è per sporco?

risposta

16

Per chiarire, sembra che tu abbia un elenco di liste di tuple. E non sembra che ci preoccupiamo di quello che sono in lista, in modo che possiamo semplificare questo a due passi

  • appiattire la lista di liste ad una lista di tuple
  • Trova il valore massimo

la prima parte può essere realizzato tramite itertools.chain (si veda ad esempio, Flattening a shallow list in Python)

il secondo può essere risolto attraverso max, si ha l'idea giusta, ma si dovrebbe essere di passaggio in una funzione piuttosto che il tipo che si desidera. Questa funzione deve restituire il valore che avete digitato su, in questo caso, la seconda parte della tupla

max(flatlist, key=lambda x: x[1]) 

Correzione

ho riletto la tua domanda - Stai cercando il massimo valore in ogni sotto-lista? Se questo è il caso, solo la seconda parte è applicabile.Basta scorrere sopra la vostra lista per ciascuna lista

Un po 'più divinatorio di quello che si ha attualmente vorrebbe

output = [] 
for lst in lists: 
    output.append(max(flatlist, key=lambda x: x[1])) 

o

map(lambda x: max(x, key=lambda y: y[1]) , lists) 
4

Come spintheblack dice, si dispone di una lista di liste di tuple . Presumo che tu stia cercando il valore intero più alto di tutte le tuple.

È possibile iterare l'elenco esterno, quindi sopra la lista di tuple tuple come questo:

max_so_far = 0 
for list in adymlist: 
    for t in list: 
    if t[1] > max_so_far: 
     max_so_far = t[1] 
print max_so_far 

Questo è un po 'più prolisso, ma potrebbe essere più facile da capire.

Problemi correlati