0

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

2 回答 2

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

编辑:通过以下方式更改条件:如果所有点,则以#else 结束,离开“打开”。

这就是您想要的(行的长度由黑客 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))
于 2016-10-29T21:45:49.300 回答
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...  
########

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

于 2016-10-29T21:50:19.990 回答