Python,连接垂直列表

Python, connecting vertical lists

我有这个,例如这个字符:

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

我存储在列表中

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

我用这个把它存储在字符中:

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

现在的问题是我想把字母 L 之间的所有点变成垂直的 #,所以像这样:

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

我现在已经尝试了几个小时,但我想不出任何东西。非常感谢帮助。

编辑: 我用它来水平连接它们。并且有效。

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

正如@U2EF1 在评论中提到的,您可以使用 zip(*chars) 对列表进行转置,然后使用正则表达式可以将 'L' 之间的点转换为“#”。然后最后 zip(*) 新项目再次获得所需的输出:

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

迟到的答案

这个可能不值得最佳答案,但仍然是另一种选择。

首先定义一个函数,将列表从水平方向旋转到垂直方向:

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

那么你可以这样使用:

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)