Python,连接垂直列表

5

我举个例子,有这些字符:

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

6
zip(*chars)chars转置。如果你已经有一个水平方向上工作的程序,你就做好了。 - U2EF1
2个回答

6

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

1
@Roberto 从计算上来说,这似乎有些过度了,但既然主要是教育性质的,那也不算太糟糕。 - U2EF1
2
@Roberto 我并没有假设 OP 只想将 L.L 替换为 L#L,我的解决方案也适用于像 L.SLL....L(OP 说:*我想把字母 L 之间的所有点都变成 #*)这样的情况。所以,我不认为这是过度设计。如果他们只想将 L.L 转换为 L#L,那么肯定有更好的方法可以实现。 - Ashwini Chaudhary
如果有人想知道这个的目的,我打算实现A*算法,以找到从U到S的最佳路径,#-不能横穿这些。 - duk
@simon101 嗯,那我删掉我的回答吧,因为它不符合规格。 :) - Roberto
嗯,实现A*算法似乎比我想象的要难,有人能告诉我应该采用什么方法来与列表进行交互吗? - duk
显示剩余2条评论

3

晚回答

这个也许并不值得被评为最佳答案,但是它仍然是一个可行的替代方案。

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

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)

您的 invert 函数可以更简单、更高效地完成(通过避免在每次循环中重新分配字符串),如使用 [''.join(c) for c in zip(*chars)] - lvc
我不知道输出情况,但你的代码存在明显的语法错误。所以,在发布之前最好先运行一下。 - Ashwini Chaudhary
@AshwiniChaudhary 现在在工作... 我在我的反转函数中缩进了太多次。 - buydadip
请注意,除了这个之外,您的解决方案还会错过重叠的组:L.L.L - Ashwini Chaudhary
@AshwiniChaudhary 我的原始答案是为提供的示例而设计的,但我还是进行了编辑。如果我的正则表达式匹配有误,请告知我。 - buydadip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接