2015-01-19 15 views
5

ho questa Per esempio, questo caratteri:Python, che collega le liste verticali

.....U...... 
L...L.###### 
.S....#..... 
....L....... 

che ho memorizzato in un elenco

chars = ['.....U......', 'L...L.######', '.S....#.....', '....L.......'] 

Ho usato questo per memorizzare nelle caratteri:

for x in range(0, N): 
    g = input() 
    chars.append(g) 

Ora il problema è che voglio trasformare tutti i punti tra le lettere L in # ma in verticale, così in questo modo:

Ho cercato per un paio d'ore e non riesco a pensare a nulla. Aiuto molto apprezzato.

MODIFICA: L'ho usato per collegarli orizzontalmente. E funziona.

while y != N: 
    modchars0 = list(chars[y]) 

    if modchars0.count('L') == 0: 
     y += 1 

    else: 
     for k in range(0, M): 
      if 'L' in modchars0[k]: 
       start = k + 1 
       break 

     for l in range(M-1, 0, -1): 
      if 'L' in modchars0[l]: 
       end = l 
       break 

     for h in range(start, end): 
      if 'L' in modchars0[h]: 
       pass 
      else: 
       modchars0[h] = '#' 

     modchars1 = modchars1.join(modchars0) 
     chars[y] = modchars1 
     y += 1 
+6

'zip (* caratteri)' prende la trasposta di 'chars'. Se hai già una routine che funziona in orizzontale, sei pronto. – U2EF1

risposta

6

Come @ U2EF1 accennato nei commenti si può prendere la trasposta della lista usando zip(*chars) e quindi utilizzando espressioni regolari è possibile convertire punti tra 'L' a '#'. uscita e poi alla fine zip(*) i nuovi elementi di nuovo per ottenere desiderato:

>>> import re                
>>> r = re.compile(r'(?<=L).*(?=L)')      
>>> def rep(m):           
    return m.group().replace('.', '#') 
... 
>>> zipped = (r.sub(rep, ''.join(x)) for x in zip(*chars)) 
>>> for x in zip(*zipped): 
    print ''.join(x) 
...  
.....U...... 
L...L.###### 
.S..#.#..... 
....L....... 
+0

Grazie mille. – simon101

+0

Non sta comprimendo e riordinando un po 'eccessivo? Questo ha superato una soluzione più semplice con elenchi più lunghi o con elenchi di stringhe più lunghe? Non inteso come critico, in realtà sono interessato all'apprendimento. – Roberto

+1

@Roberto Computazionale oltre l'eccessivo, sì. Ma questo sembrava principalmente educativo, quindi non è così male. – U2EF1

3

tardo risposta

Questo probabilmente non merita risposta migliore, ma è un'alternativa comunque.

prima definire una funzione che ruoterà la lista da orizzontale a verticale:

def invert(chars): 
    inverted = [] 
    for i in range(len(chars[0])): 
     newStr="" 
     for j in range(len(chars)): 
      newStr+=chars[j][i] 
     inverted.append(newStr) 
    return inverted 

allora si può usare in questo modo:

def main(): 
    chars = ['.....U......', 'L...L.######', '.S....#.....', '....L.......'] 
    invChars = invert(chars) 

    for i in range(len(invChars)): 
     invChars[i] = re.sub(r'(?<=L)(\..*?)L', lambda k: k.group().replace('.','#'), invChars[i]) 

    chars = invert(invChars) 
+0

Grazie, sembra anche una buona soluzione. – simon101

+0

La funzione 'invert' può essere eseguita in modo più semplice ed efficiente (evitando di riallineare stringhe ogni volta attorno ad un loop) come' ['' .join (c) per c in zip (* chars)] '. – lvc

+0

Non so sull'output, ma c'è un chiaro errore di sintassi nel codice.Quindi, meglio eseguirlo prima di postare. –