2015-10-15 8 views
5

Sto usando il seguente (brutto) snippet per scorrere su un elenco bidimensionale con stringhe. Controlla se uno dei valori è '0' e se non è l'ultimo elemento. In caso contrario, cambierà i valori dell'elemento corrente (che è '0') con il valore dell'elemento successivo.Spingere tutti i non-'0 'in primo piano

Quello che intendevo fare con questa funzione è quello di spingere tutti i valori non '0' sul retro. Ovviamente non funziona come previsto (è un inizio), ma non riesco a trovare un modo per ottenere questo risultato senza trasformarlo in un gran casino.

Qual è il pezzo mancante del puzzle? L'aiuto alla ricorsione sarebbe qui?

['0', '2', '0', '4'] 

dovrebbe trasformarsi in

['2', '4', '0', '0'] 

e

['0', '3', '1', '0', '2'] 

in

['3', '1', '2', '0', '0'] 

frammento attuale:

for idx, x in enumerate(self.list_x): 
    for idy, i in enumerate(x): 
     if i == '0': 
      try: 
       if x[idy+1]: 
        pass 
      except IndexError: 
       pass 
      else: 
       temp = i 
       self.list_x[idx][idy] = x[idy+1] 
       self.list_x[idx][idy+1] = temp 

risposta

4
In [63]: A = ['0', '2', '0', '4'] 

In [64]: B = ['0', '3', '1', '0', '2'] 

In [65]: [i for i in A if i!='0'] + [i for i in A if i=='0'] 
Out[65]: ['2', '4', '0', '0'] 

In [66]: [i for i in B if i!='0'] + [i for i in B if i=='0'] 
Out[66]: ['3', '1', '2', '0', '0'] 
+1

perche non modifica il tuo post per aggiungere più spiegazioni su ciò che il codice fa e perché possa risolvere il problema. Una risposta che per lo più contiene solo codice (anche se funziona) di solito non aiuta l'OP a capire il loro problema. – SuperBiasedMan

0
In [79]: L = ['0', '2', '0', '4'] 

In [80]: inds = [i for i,e in enumerate(L) if e!='0'] 

In [81]: answer = list(operator.itemgetter(*inds)(L)) + ['0']*(len(L)-len(inds)) 

In [82]: answer 
Out[82]: ['2', '4', '0', '0']