繁体   English   中英

我的python列表理解由于语法错误而失败

[英]My python list comprehension fails due to a syntax error

使用3.2.3版的Python noob ...

class Card:
    def __init__(self, suitID, rank):
            self.suits = ("Spades", "Hearts", "Diamonds","Clubs")
            self.rank = rank
            self.suit = self.suits[suitID]

    def __str__(self):
            return (str("%s of %s" % (self.rank, self.suit)))


class Deck:
    def __init__(self):
            self.cards = [Card(i//13, i%13) for i in range(52)]

以上是我的设置方法,对我来说似乎不错。 以下是混淆(请忽略return(“”)语句,因为这仅用于测试)

情况1:

def __str__(self):
    print ( self.cards [i for i in range (52) ] )
    return("")

输出:

File "cardgame.py", line 21
print (self.cards[i for i in range(52)])
                      ^
SyntaxError: invalid syntax

为什么会出错? 我以为那是LC的使用方式...


情况2:

def __str__(self):
    print (myCards for myCards in self.cards)
return ("")

输出:

<generator object <genexpr> at 0x2256fa0>

同样,这是什么意思,为什么它不输出数据?


情况3:

def __str__(self):
    for myCard in self.cards:
          print (myCard)
    return ("")

输出:

0 of Spades
1 of Spades
2 of Spades
3 of Spades
4 of Spades
...
..
.

现在,这恰好输出了我想要的东西,但这使我更加困惑。 我的印象是,这三种情况都是等效的,而显然不是。 有什么区别?

提前致谢。

情况1:

您应该将整数(而不是i for i in range (52)传递i for i in range (52)中的i for i in range (52)作为列表的索引。 尝试print [self.cards[i] for i in range(52)] 如果print self.cards中只有52张卡,则可以写出print self.cards self.cards

情况2和情况3:

(myCards for myCards in self.cards)是Python中的生成器 您可以像案例3中的列表一样对其进行迭代,但是一开始它不会返回其所有元素,这是生成器的重要功能。

是列表理解,您最好学习它的语法。

li = [1,2,3]

la = [i for i in li]#la是一个列表[1,2,3]

lb =(i对i in li)#lb是一个生成器对象,list(lb)是[1,2,3]

在情况1中,可以print [self.cars[i] for i in range(52)]

在您的代码(self.cars[i for i in range(52)])[i for i in range(52)] (self.cars[i for i in range(52)])[i for i in range(52)]是一个列表,因此self.cars[list objeject]无效。

print (self.cards[i for i in range(52)])

您正在尝试使用列表索引到列表中。 就像执行以下操作:

>>> l = [4,5,6]
>>> l[i for i in range (3)]
  File "<stdin>", line 1
    l[i for i in range (3)]

对于第一种情况,这不是安排Python语法的方式。

print(self.cards[i for i in range (52)])

你是一个索引list与另一个list 这没有任何意义。 您可能打算做的是:

print([self.cards[i] for i in range(52)])

请注意,这只是创建一个新list 在具有52个元素的list上运行的表达式[self.cards[i] for i in range(52)]具有与self.cards相同的结果。 您正在添加不必要的内容并转圈。

对于第二种情况,这是:

print(myCards for myCards in self.cards)

正在打印生成器表达式,其表示为:

<generator object <genexpr> at 0x2256fa0>

对于第三种情况,它打印该对象中的每个项目而不是打印对象本身,您可以在上面用*解压缩生成器表达式并指定自定义分隔符:

print(*(myCards for myCards in self.cards), sep='\n')

当然,请注意,您将无缘无故再次复制该list 只需使用原始的而不是花费时间和精力(包括您和计算机的时间和精力)来制作新的。

print(*myCards, sep='\n')

暂无
暂无

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

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