2010-06-30 15 views
9

Estoy almacenar tramas clave animación a partir de Cinema 4D (utilizando el Py4D impresionante) en unas listas de listas:¿Cómo obtengo el índice de la lista más grande dentro de una lista de listas usando Python?

props = [lx,ly,lz,sx,sy,sz,rx,ry,rz] 

Imprimí los fotogramas clave para cada propiedad/pista en una animación arbitraria y que son de diferentes longitudes:

track Position . X has 24 keys 
track Position . Y has 24 keys 
track Position . Z has 24 keys 
track Scale . X has 1 keys 
track Scale . Y has 1 keys 
track Scale . Z has 1 keys 
track Rotation . H has 23 keys 
track Rotation . P has 24 keys 
track Rotation . B has 24 keys 

Ahora bien, si quiero usar esas llaves en Blender que tengo que hacer algo como:

  1. ir al cuadro actual
  2. establecer las propiedades de ese fotograma clave (puede ser la ubicación, rotación, escala) e inserte un fotograma clave

Hasta ahora, mi plan es:

  1. Loop desde 0 hasta el número máximo de clave marcos para todas las propiedades
  2. bucle a través de cada propiedad
  3. Comprobar si tiene un valor almacenado para la clave actual, si es así, ir al marco en Blender y almacenar los valores/insertar fotograma clave

¿Es esta la mejor manera de hacerlo?

Este es el contexto de la pregunta.

Primero necesito encontrar la lista más grande que apuntala a las tiendas. Soy nuevo en Python y me preguntaba si había una función mágica que hiciera eso por ti. Similar a max(), pero para longitudes de lista.

Por el momento estoy pensando en la codificación de esta manera:

//after props are set 
lens = [] 
for p in props: lens.append(len(p)) 
maxLen = max(lens) 

¿Cuál sería la mejor manera de conseguir eso?

Gracias

Respuesta

21
max(enumerate(props), key = lambda tup: len(tup[1])) 

Esto le da una tupla que contiene (index, list) de la lista más larga de los apoyos.

+0

+1 para usar una función específicamente diseñada para este propósito. – Brian

+0

esto funciona genial! ¡Gracias! –

+0

¿Qué pasa si hay una igualdad? Diga adentro de la lista A, tengo tres listas secundarias con tamaños de 3, 3, 2? Entonces volverá? –

8

Puede utilizar una expresión generadora:

maxLen = max(len(p) for p in props) 
+0

Esto le consigue la longitud de la longitud más grande. Tendrá que pasar la lista una segunda vez para obtener la lista si lo hace de esta manera. – Brian

+0

De la respuesta de shambulator, esta respuesta podría cambiarse a 'maxList = max (a, clave = lambda tup: len (tup))'. Entonces, max es una "función mágica que hace eso por ti", ya que puede incluir un parámetro clave. – Brian

Cuestiones relacionadas