我试图在提供的列表周围打印"#"的边框,到目前为止设法获得正确的长度。但是有一个条件,它会输出一个',在"A"作为"开头"出现在列表第一个位置的右侧行。我该如何创建一个条件来正确打印它呢?
我将使用这个函数的其他列表与不同的长度。
代码我有:
area0 = [['.', 'A', 'A', '.', '.', '.'],['.', '.', '.', '.', '.',]]
def show_locale(area):
count = len(area) + 4
mark = "#"*count
return "#{mark}#n# {area} n#{mark}#".format(mark=mark,area=area)
show_locale(area0)
我想打印的:
print(show_lot(lot0))
########
#.AA....
#......#
########
示例2:
print(show_lot(lot3))
######
#...f#
#AA.e.
#...f#
#.XXX#
#....#
#.yZZ#
######
- 首先,
count
不正确。你在计算行数,你应该计算列数。 - 第二,您必须使用
str.join
将列表转换为字符串 - 第三,我在列表理解中的三元表达式中编码的结尾有一个条件:如果行包含
A
,它"打开"结束,否则它以#
结束。不确定它是否涵盖了所有情况…
编辑:修改条件:if all dots, then end with #
else leave "open"
这就是您想要的(行长度由您提供的不完整示例的hack ATM处理)
area0 = [['.', 'A', 'A', '.', '.', '.'],['.', '.', '.', '.', '.',]]
def show_locale(area):
count = len(area[0]) + 2
mark = "#"*count
##return "n".join([mark]+["".join(['#']+a+['.' if 'A' in a else '.#']) for a in area0]+[mark])
return "n".join([mark]+["".join(['#']+a+['.#' if all(x=='.' for x in a) else '.']) for a in area0]+[mark])
print(show_locale(area0))
编辑:添加'A'出现在列表第一个位置的条件
这是另一个解决方案,适用于不同长度的列表。
area0 = [['.', 'A', 'A', '.', '.', '.'],['.', '.', '.', '.', '.',], ['A', '.', '.', '.',]]
def print_box(l):
max_len = 0
for i in l:
max_len = max(max_len, len(i))
print("#" * (max_len+2))
for i in l:
if i[0] == 'A':
# Print an open end
print("#{}".format("".join(i).ljust(max_len, " ")))
else:
print("#{}#".format("".join(i).ljust(max_len, " ")))
print("#" * (max_len+2))
print_box(area0)
########
#.AA...#
#..... #
#A...
########
较短的列表将用空格填充。