2015-10-15 2 views
5

Ich benutze das folgende (hässliche) Snippet, um über eine zweidimensionale Liste mit Strings zu iterieren. Es prüft, ob einer der Werte '0' ist und ob es nicht das letzte Element ist. Ist dies nicht der Fall, werden die Werte des aktuellen Elements ('0') durch den Wert des nächsten Elements ersetzt.Alle nicht-'0 'nach vorne schieben

Was ich mit dieser Funktion erreichen wollte, ist, alle nicht '0' Werte auf die Rückseite zu schieben. Es funktioniert natürlich nicht wie erwartet (es ist ein Anfang), aber ich kann keinen Weg finden, dies zu erledigen, ohne es in ein großes Durcheinander zu verwandeln.

Was ist das fehlende Teil des Puzzles? Würde Rekursion hier helfen?

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

sollte in drehen

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

und

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

in

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

Aktuelle Schnipsel:

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 

Antwort

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

Bitte betrachten Sie Ihre Post Bearbeitung mehr Erklärung hinzuzufügen, was Ihr Code tut und warum wird es das Problem lösen. Eine Antwort, die meist nur Code enthält (auch wenn es funktioniert), hilft dem OP normalerweise nicht, sein Problem zu verstehen. – 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']