如何在python中使用列表理解

时间:2019-05-05 13:26:08

标签: python python-3.x python-2.7

我使用python尝试了简单的模式程序。但是我尝试将我的代码转换为列表理解代码。但是它显示了无效的语法错误。如何解决

pattera.py

# Without List Compreshion
class Apattern:
    def __init__(self,row,column):
        self.row = row
        self.column = column

    def a_pattern(self):


        for i in range(self.row):
            for j in range(self.column):
                if i == 0 or j == 0 or j == self.column-1 or i == 2:
                    print("*",end=" ")
                else:
                    # print(j,end=" ")
                    print(" ",end=" ")
            print()


a1 = Apattern(5,5)
a1.a_pattern()

patterna.py

class Apattern:
    def __init__(self,row,column):
        self.row = row
        self.column = column

    def a_pattern(self):

        data = [print("*",end=" ") print() for i in range(self.row) for j in range(self.column) if i == 0 or j == 0 or j == self.column-1 or i == 2 else print(" ",end=" ") ]
        print(data)

a1 = Apattern(5,5)
a1.a_pattern()

1 个答案:

答案 0 :(得分:3)

就像其他人说的那样,列表理解在这里不适合,它用于您想要获取列表的情况,但是在这里您只想打印出来。

但是如果您坚持这一点,我可以为您提供两个版本:

  1. 我们可以使用列表推导来生成结果列表,该元素是每一行:
def a_pattern(self):
    # generate the result list of each line
    result = [' '.join(['*'] * self.column)
               if i in (0, 2) else (' ' * (self.column * 2 - 3)).join('**')
               for i in range(self.row)]

    for line in result:
        print(line)
  1. 如果您坚持根据逻辑在列表理解中调用print,则可以尝试以下方式:
def a_pattern(self):
    # print logic in list comprehension
    _ = [print("*", end=" ") or j == self.column - 1 and print('')
            if i == 0 or j == 0 or j == self.column - 1 or i == 2
            else print(" ", end=" ") or j == self.column - 1 and print('')
            for i in range(self.row) for j in range(self.column)]

我会在这里解释:
关键和最困难的部分是我们必须print('')每行之后j == self.column - 1时。
在这里,我使用and/or中的惰性求值:
j == self.column - 1 and print('')
如果j不是最后一个索引,则不会调用print(''),否则它将调用print('')

  

注意:这只是对列表理解和惰性评估的研究,请勿在代码中使用。

     

借助一些技巧,我们甚至可以创建变量或在列表理解中添加break逻辑,但这只是出于娱乐目的。 :)