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我最初的答案是为了工作或者提供的例子,但我还是编辑了。如果我的正则表达式匹配中缺少什么,请告诉我。