2015-01-19 20 views
5

bu karakterler:Python, bağlantı dikey listeleri

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

i karakter depolamak için bu kullanılan

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

liste halinde depolanan:

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

Şimdi sorun şu ki, L harfleri arasındaki tüm noktaları [# '] içine ama dikey olarak çevirmek istiyorum:

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

Şu an için birkaç saat çalışıyorum ve hiçbir şey düşünemiyorum. Çok takdir yardımcı olur.

DÜZENLEME: Bunu yatay olarak bağlamak için kullandım. Ve çalışıyor. @ U2EF1 Eğer zip(*chars) kullanarak listenin devrik alabilir yorum olarak bahsedilen ve daha sonra '#' için 'L' arasındaki noktalar dönüştürebilirsiniz regex kullanarak gibi

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

'fermuar (* karakter) 'devrik alır 'chars'. Zaten yatay çalışan bir rutininiz varsa, belirlenirsiniz. – U2EF1

cevap

6

. Sonra zip(*) yeni öğeler tekrar sonunda istenen almak çıkışı:

>>> 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

Çok teşekkür ederim. – simon101

+0

Biraz aşırı sıkıştırma yapmıyor mu? Bu, daha uzun listelerle veya daha uzun dizelerle daha basit bir çözümü atlatır mı? Eleştirmen olarak değil, aslında öğrenme ile ilgileniyorum. – Roberto

+1

@Roberto Hesaplama aşırı derecede ötesinde, evet. Ama bu esas olarak eğitici görünüyordu, bu yüzden o kadar da kötü değil. – U2EF1

3

Geç Cevap

Bu muhtemelen en iyi yanıtı hak etmiyor, ancak alternatif yine olduğunu.

sonra
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 

Bu şekilde kullanabilir:

ilk dikey yatay listeyi döner bir fonksiyon tanımlama

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

Teşekkürler, oldukça iyi bir çözüm gibi görünüyor. – simon101

+0

'Invert' işleviniz daha basit ve daha verimli bir şekilde yapılabilir (bir döngü etrafında her seferinde dizeleri yeniden ayırmaktan kaçınarak) zip (* karakter)] 'de c [' 'için .join (c)' yi kullanın. – lvc

+0

Çıktı hakkında bilmiyorum, ancak kodunuzda net bir sözdizimi hatası var.Yani, göndermeden önce daha iyi çalıştırın. –