2015-10-15 13 views
5

Używam następującego (nieprzyjemnego) fragmentu do iteracji na dwuwymiarowej liście z ciągami. Sprawdza, czy jedna z wartości to '0' i czy nie jest to ostatni element. Jeśli tak nie jest, przełącza wartości bieżącego elementu (który jest '0') z wartością następnego elementu.Przesyłaj wszystkie znaki spoza zakresu '0' na początek

Co zamierzałem osiągnąć za pomocą tej funkcji, to przesunięcie wszystkich wartości innych niż '0' do tyłu. To oczywiście nie działa zgodnie z oczekiwaniami (jest to początek), ale nie mogę wymyślić sposobu, aby to zrobić bez przekształcania go w wielki bałagan.

Jaki brakujący element układanki? Czy rekursja pomogłaby tutaj?

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

powinna przekształcić

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

i

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

do

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

Obecny fragment:

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 

Odpowiedz

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

Proszę rozważyć edycji posta, aby dodać więcej wyjaśnień na temat tego, co kod robi i dlaczego to będzie rozwiązać ten problem. Odpowiedź, która najczęściej zawiera kod (nawet jeśli działa) zazwyczaj nie pomoże OP zrozumieć ich problemu. – 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'] 
Powiązane problemy