2011-02-10 32 views
7

Tengo un problema para conseguir el más alto valor en una lista dinámica de listas de tuplas.
La lista se parece a esto:Valor máximo dentro de una lista de listas de Tupla

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

Ahora bucle a través de la lista para obtener el mayor valor (entero):

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, ..} 

He intentado un montón de obtener el máximo valor pero he encontrado ninguna conclusión para mi problema Sé que debo recorrer cada Tupla de la Lista y compararla con la siguiente, pero no sé cómo codificarla correctamente.

También puedo usar la función max() pero no funciona con cadenas y números enteros. f.e. a = [ ('a',5),('z',1)] -> el resultado es max(a) ---> ('z',1) obv 5> 1 pero z> a, así que traté de expandir la función máxima con max(a, key=int) pero recibí un Error de tipo.

espero que puedan entender lo que quiero ;-)

ACTUALIZACIÓN

Gracias hasta ahora.

Si uso itertools.chain(*adymlist) y max(flatlist, key=lambda x: x[1])
voy a conseguir una excepción como: max_word = max (flatlist, clave = lambda x: x [1]) TypeError: objeto 'int' es unsubscriptable

pero si use itertools.chain(adymlist) funciona bien. Pero no sé cómo sumar todos los enteros de cada Tupla de la lista. Necesito tu ayuda para resolverlo.

De lo contrario, escribí una solución para itertools.chain(*adymlist) para obtener la suma de todos los números enteros y el número entero más alto en esa lista.

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] 

Todavía hace lo que yo quiero, pero no es ensuciar?

Respuesta

16

Para aclarar, parece que tienes una lista de listas de tuplas. No se ve como nos importa lo que la lista que se encuentran, por lo que puede simplificar esto a dos pasos

  • aplanar la lista de listas a una lista de tuplas
  • encontrar el valor máximo

la primera parte se puede lograr a través de itertools.chain (véase, por ejemplo, Flattening a shallow list in Python)

la segunda puede ser resuelto a través máximo, usted tiene la idea correcta, pero debe de estar pasando de una función más que el tipo que desee. Esta función debe devolver el valor que ha tecleado en adelante, en este caso, la segunda parte de la tupla

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

Corrección

he vuelto a leer su pregunta - ¿Está buscando el máximo valor en cada sub-lista? Si este es el caso, solo la segunda parte es aplicable.Simplemente iterar sobre la lista para cada lista

Un poco más Pythonic que lo que tiene actualmente le gustaría

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

Como dice spintheblack, usted tiene una lista de listas de tuplas . Supongo que estás buscando el valor entero más alto de todas las tuplas.

Usted puede iterar sobre la lista externa, a continuación, sobre la lista de tuplas tuplas como esto:

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 

Esto es un poco más detallado, pero podría ser más fácil de entender.

Cuestiones relacionadas