功能:在列表周围打印边框

时间:2016-10-29 21:35:49

标签: python python-3.x format output-formatting

我正在尝试在提供的列表周围打印“#”边框,并且到目前为止设法获得正确的长度。但是有条件会打印'。'在右侧的行中,“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#
######

2 个答案:

答案 0 :(得分:1)

  • 首先,count不正确。您正在计算行数,您应该在哪里计算列数。
  • 第二,您必须使用str.join
  • 将列表转换为字符串
  • 第三,结尾的条件是我在列表理解中的三元表达式中编码:如果行包含A,则"打开"结束,否则以#结束。不确定它是否涵盖了所有情况......

编辑:改变条件:如果所有点都是,那么以#结束,否则离开"打开"。

这样做你想要的(行的长度由黑客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))

答案 1 :(得分:0)

编辑:为' 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...  
########

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