Python:有没有更好的方法将多个不同的对象附加到列表中

Posted

技术标签:

【中文标题】Python:有没有更好的方法将多个不同的对象附加到列表中【英文标题】:Python: is there a better way to append multiple different objects to a list 【发布时间】:2021-07-01 08:01:38 【问题描述】:

我正在尝试在 python 上创建一个垄断交易游戏,但在初始化对象列表时遇到了一些麻烦。每个卡类都有一个种类,即卡的类型和值。我想创建一个包含不同数量的不同卡片的列表

到目前为止,我的代码如下所示:

class Card:
    def __init__(self, value,kind):
        self.value = value
        self.kind = kind

    def __str__(self):
        return " : ".format(self.value,self.kind)

    def __repr__(self):
        return str(self)

    def show(self):
        print(self)
class Deck:
    def __init__(self):
        self.cards = []
        self.build()

    def build(self):
        #money cards
        self.cards.extend([Card(1,"money")] * 6)
        self.cards.extend([Card(2, "money")] * 5)
        self.cards.extend([Card(3, "money")] * 3)
        self.cards.extend([Card(4,"money")] * 3)
        self.cards.extend([Card(5,"money")] *2)
        self.cards.extend([Card(10,"money")])
        #action cards
        self.cards.extend([Card("dealbreaker", "action")] * 2)
        self.cards.extend([Card("justsayno", "action")] * 3)
        self.cards.extend([Card("passgo", "action")] * 10)
        self.cards.extend([Card("forceddeal", "action")] * 3)
        self.cards.extend([Card("slydeal", "action")] * 3)
        self.cards.extend([Card("debtcollector", "action")] * 3)
        self.cards.extend([Card("birthday", "action")] * 3)
        self.cards.extend([Card("doublerent", "action")] * 2)
        self.cards.extend([Card("houses", "action")] * 3)
        self.cards.extend([Card("hotels", "action")] * 2)
        #property cards
        self.cards.extend([Card("blue", "property")] * 2)
        self.cards.extend([Card("brown", "property")] * 2)
        self.cards.extend([Card("utility", "property")] * 2)
        self.cards.extend([Card("green", "property")] * 3)
        self.cards.extend([Card("yellow", "property")] * 3)
        self.cards.extend([Card("red", "property")] * 3)
        self.cards.extend([Card("orange", "property")] * 3)
        self.cards.extend([Card("pink", "property")] * 3)
        self.cards.extend([Card("lightblue", "property")] * 3)
        self.cards.extend([Card("railroad", "property")] * 4)

现在我想知道是否有更好的方法来创建我的卡片列表而无需太多重复。我找不到循环和追加的方法,因为每张卡都必须有自己的类型和值,而且每张卡的数量也不同。

如果我遗漏了什么,请告诉我。有没有办法通过列表理解来做到这一点?任何帮助表示赞赏,在此先感谢!

【问题讨论】:

也许最好使用一个包含游戏中所有卡片类型的json类字典,即cards = "property": "utility" : 0 ,这里的0是属性/实用卡片的数量.您可以将其存储为卡片组的一部分,即self.cards = cards ...。这也意味着您可以将此字典重用于玩家或其他任何可以存储卡片的东西。 【参考方案1】:

将您的卡配置存储在列表列表中,例如[[1, "money", 6], ...],以便您可以循环访问它:

CARD_CONFIG = [
    [1, "money", 6],
    [2, "money", 5],
    [3, "money", 3],
    [4, "money", 3],
    [5, "money", 2],
    [10, "money", 1],
    ...
]

for value, kind, qty in CARD_CONFIG:
    self.cards.extend([Card(value, kind)] * qty)

【讨论】:

谢谢,这确实有效,但它仍然是很长的一段代码,因为我仍然需要添加 20-30 个额外的卡片。还是比我原来的方法好很多。【参考方案2】:

我能想到的唯一可以减少代码量的方法是预先对所有列表求和,然后附加到主列表。

例如转这个:

        self.cards.extend([Card("blue", "property")] * 2)
        self.cards.extend([Card("brown", "property")] * 2)
        self.cards.extend([Card("utility", "property")] * 2)
        self.cards.extend([Card("green", "property")] * 3)
        self.cards.extend([Card("yellow", "property")] * 3)
        self.cards.extend([Card("red", "property")] * 3)
        self.cards.extend([Card("orange", "property")] * 3)
        self.cards.extend([Card("pink", "property")] * 3)
        self.cards.extend([Card("lightblue", "property")] * 3)
        self.cards.extend([Card("railroad", "property")] * 4)

进入这个:

    self.cards.extend([Card("blue", "property")] * 2 + 
        [Card("brown", "property")] * 2 + 
        [Card("utility", "property")] * 2 + 
        [Card("green", "property")] * 3 + 
        [Card("yellow", "property")] * 3 + 
        [Card("red", "property")] * 3 + 
        [Card("orange", "property")] * 3 + 
        [Card("pink", "property")] * 3 + 
        [Card("lightblue", "property")] * 3 + 
        [Card("railroad", "property")] * 4)

【讨论】:

以上是关于Python:有没有更好的方法将多个不同的对象附加到列表中的主要内容,如果未能解决你的问题,请参考以下文章

寻求更好的 Python 3.x+ 方法在一个函数中构建多个不同的 HTML

python将多个excel中的所有工作表附加到pandas数据框中的有效方法

为python中的可视化目的附加表(不同的行号)

TypeError:“方法”类型的对象没有 len() |试图将文件附加到电子邮件消息

python MIME将多个附件附加到多部分消息

是否有更好/更简单的方法将 html 表单序列化为对象