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)
我有这个,例如这个字符:
.....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)