2013-10-26 14 views
8

Ho il seguente codice python che utilizza zip() e sembra causare il troncamento dei dati indesiderati.python: evitando il troncamento zip della lista

inc_data = [[u'Period Ending', u'Dec 31, 2012', u'Dec 31, 2011', u'Dec 31, 2010'], 
      [u'Total Revenue\n', u'104,507,100\n', u'106,916,100\n', u'99,870,100\n'], 
      [u'Cost of Revenue\n',u'56,000,000\n'] 
      ] 

inc_data2 = zip(*inc_data) 
for i in inc_data2: 
    print i 

E 'solo stampe:

(u'Period Ending', u'Total Revenue\n', u'Cost of Revenue\n') 
(u'Dec 31, 2012', u'104,507,100\n', u'56,000,000\n') 

ma voglio che per stampare i seguenti, ma a quanto pare devo aggiungere in riempitivi u'' a mano al fine di prevenire zip() dal troncando l'inc_data. Ma non so come codificarlo.

(u'Period Ending', u'Total Revenue\n', u'Cost of Revenue\n') 
(u'Dec 31, 2012', u'104,507,100\n', u'56,000,000\n') 
(u'Dec 31, 2011', u'106,916,100\n', u'') 
(u'Dec 31, 2010', u'99,870,100\n', u'') 

Per descrivere inc_data sopra,

inc_data = [ [x], 
      [y], 
      [z] ] 

Come faccio x, yez siano della stessa lunghezza? E la lunghezza è la lunghezza massima di x, y o z?

(u'Period Ending', u'Total Revenue\n', u'Cost of Revenue\n') 
(u'Dec 31, 2012', u'104,507,100\n', u'56,000,000\n') 
(u'Dec 31, 2011', u'106,916,100\n', u'') 
(u'Dec 31, 2010', u'99,870,100\n', u'') 

Siamo spiacenti per la spiegazione lunga e prolisso del problema. Potresti aiutarmi o indicarmi una domanda simile a cui è stata data una risposta, se ne esiste una? grazie molto!

+2

Usa [itertools.izip_longest] (http://docs.python.org/2/library/itertools.html#itertools.izip_longest) con 'fillvalue = u''' – falsetru

risposta

16

Uso izip_longest:

from itertools import izip_longest 

inc_data = [[u'Period Ending', u'Dec 31, 2012', u'Dec 31, 2011', u'Dec 31, 2010'], 
      [u'Total Revenue\n', u'104,507,100\n', u'106,916,100\n', u'99,870,100\n'], 
      [u'Cost of Revenue\n',u'56,000,000\n'] 
      ] 

print list(izip_longest(*inc_data, fillvalue=u'')) 


# [(u'Period Ending', u'Total Revenue\n', u'Cost of Revenue\n'), 
    (u'Dec 31, 2012', u'104,507,100\n', u'56,000,000\n'), 
    (u'Dec 31, 2011', u'106,916,100\n', u''), 
    (u'Dec 31, 2010', u'99,870,100\n', u'')] 
+0

izip_longest funziona perfettamente. Una volta trasferiti i dati con izip_longest, sai come posso eliminare la prima riga in modo da non avere (u'Period Ending ', u'Total Revenue \ n', u'Cost of Revenue \ n ')? Essenzialmente, memorizzerò i dati in una tabella sqlite3. grazie molto! – vt2424253

+0

Usa una [slice:] (http://stackoverflow.com/questions/509211/pythons-slice-notation) '[[1,2], [3,4], [5,6]] [1:] = [[3, 4], [5, 6]] 'La porzione di' lista [1:] 'rimuove il primo elenco di tuple. Quindi potresti fare: 'lista (izip_longest (* inc_data, fillvalue = u '')) [1:]' ad esempio – dawg

+0

Grazie. Prova ed errore producono i risultati che mi hai dato. Non sapevo che si chiamasse slice, quindi non ero in grado di cercare quella tecnica. Grazie per il consiglio. – vt2424253

Problemi correlati