Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,连接垂直列表_Python_String_List - Fatal编程技术网

Python,连接垂直列表

Python,连接垂直列表,python,string,list,Python,String,List,我有这样一个例子,比如这个字符: .....U...... L...L.###### .S....#..... ....L....... 我把它存储在一个列表中 chars = ['.....U......', 'L...L.######', '.S....#.....', '....L.......'] 我用这个来把它储存在chars中: for x in range(0, N): g = input() chars.append(g) 现在的问题是我想把字母L之间的所有

我有这样一个例子,比如这个字符:

.....U......
L...L.######
.S....#.....
....L.......
我把它存储在一个列表中

chars = ['.....U......', 'L...L.######', '.S....#.....', '....L.......']
我用这个来把它储存在chars中:

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.......
>>重新导入

>>>r=重新编译(r’(?迟交的答案

这一个可能不值得最好的答案,但仍然是另一个选择

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

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)
def main():
chars=['…..U…','L…L.########','S…###','L…'
invChars=反转(字符)
对于范围内的i(len(invChars)):

invChars[i]=r'(?
zip(*chars)
转换了
字符
。如果你已经有了一个可以水平运行的例程,那么你就可以开始了。压缩和重新压缩不是有点过火了吗?这比使用更长列表或更长字符串列表的更简单的解决方案好吗?不是作为一个批评家,我实际上对学习感兴趣。@Roberto计算超越过火,是的。但这似乎主要是教育性的,所以也没那么糟糕。@Roberto我没有假设OP只是想用
L.L
来代替
L#L
,我的解决方案也适用于
L.SL
L…L
(OP说:我想把字母L之间的所有点都变成#)所以,我不认为这是一种过分的做法。如果他们只想把
L.L
变成
L#L
,那么这肯定可以用更好的方式来完成。@AshwiniChaudhary是正确的。角色甚至不必是完全相同的宽度和高度,所以你可以得到L..L..L等。如果有人想知道这一点,我是plann要实现a*算法以找到从U到S的最佳方式,#-无法跨越这些路径您的
invert
函数可以更简单、更高效地执行(通过避免每次在循环中重新分配字符串),如
['.join(c)for c in zip(*chars)]
。我不知道输出,但您的代码中有一个明显的语法错误。因此,最好在发布之前运行它。@AshwiniChaudhary现在可以工作了……我在反转函数中缩进了太多次注意,除了您的解决方案还将错过重叠的组:
L.L.L
@AshwiniChaudhary我最初的答案是为了工作或者提供的例子,但我还是编辑了。如果我的正则表达式匹配中缺少什么,请告诉我。