繁体   English   中英

如何在python中使用列表理解

[英]How to use list Comprehension in python

我使用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. 我们可以使用列表推导来生成结果列表,该元素是每一行:
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逻辑,但这只是为了好玩。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM