功能:打印列表边框



我试图在提供的列表周围打印"#"的边框,到目前为止设法获得正确的长度。但是有一个条件,它会输出一个',在"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...  
########

较短的列表将用空格填充。

最新更新