2010-06-30 16 views
9

sto memorizzazione di fotogrammi chiave di animazione da Cinema4D (utilizzando l'impressionante py4D) in un elenco di liste:Come posso ottenere l'indice della lista più grande all'interno di un elenco di liste usando Python?

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

ho stampato i fotogrammi chiave per ogni proprietà/pista in un'animazione arbitrario e sono di diverse lunghezze:

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 

Ora, se voglio usare quelle chiavi in ​​Blender che devo fare qualcosa di simile:

  1. andare al frame corrente
  2. impostare le proprietà di quella struttura chiave (possono essere posizione, rotazione, scala) e inserire un fotogramma chiave

Finora il mio piano è:

  1. Loop da 0 al numero massimo di chiave cornici per tutte le proprietà
  2. ciclo attraverso ogni proprietà
  3. Verifica se ha un valore memorizzato per la chiave corrente, in caso affermativo, passare al telaio in Blender e memorizzare i valori/inserisci fotogramma chiave

È questo il modo migliore per farlo?

Questo è il contesto per la domanda.

Prima ho bisogno di trovare la lista più grande che negozi di oggetti di scena. Sono nuovo di Python e mi chiedevo se esistesse una funzione magica che lo fa per te. Simile a max(), ma per lunghezze di lista.

Al momento sto pensando di codifica in questo modo:

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

Quale sarebbe il modo migliore per ottenere questo?

Grazie

risposta

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

Questo vi dà una tupla contenente (index, list) della lista più lunga puntelli.

+0

+1 per l'utilizzo di una funzione appositamente progettata per questo scopo. – Brian

+0

questo funziona brillante! Grazie! –

+0

Cosa succede se c'è un'uguaglianza? Dire all'interno della lista A, ho tre sotto-liste con dimensioni di 3, 3, 2? –

8

è possibile utilizzare un generatore di espressione:

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

Questo ti garantisce la lunghezza della lunghezza maggiore. Dovrai passare la lista una seconda volta per ottenere la lista stessa se lo fai in questo modo. – Brian

+0

Dalla risposta di shambulator, questa risposta può essere cambiata in 'maxList = max (a, key = lambda tup: len (tup))'. Quindi, max è una "funzione magica che lo fa per te", poiché può contenere un parametro chiave. – Brian

Problemi correlati