【问题标题】:how to copy a class' dict with 2 parameters into 2 lists如何将具有 2 个参数的类的字典复制到 2 个列表中
【发布时间】:2020-01-09 17:04:06
【问题描述】:

我有一个包含 2 个参数列表的类,如果用户确认,我必须将它们保存到 2 个列表中,修改它并从第二行恢复原始列表。 这是我的代码:

    class Pokemon:
        def __init__(self):
            self.pokemon = {"Poke_Name": "", "Poke_Specie": "", "Poke_Type": "", "Poke_Weight": "", 
            "Poke_Height": "", "Poke_Abilities": [], "Poke_Stats": [], "URL": ""}

        def set_Poke_Name(self, name):
            self.pokemon["Poke_Name"] = name

        def set_Poke_Specie(self, specie):
            self.pokemon["Poke_Specie"] = specie

        def set_Poke_Type(self, tipo):
            self.pokemon["Poke_Type"] = tipo

        def set_Poke_Weight(self, peso):
            self.pokemon["Poke_Weight"] = peso

        def set_Poke_Height(self, altezza):
            self.pokemon["Poke_Height"] = altezza

        def add_Abilities(self, abilita):
            self.pokemon["Poke_Abilities"].append(abilita.poke_abilities)

        def add_Stats(self, stats):
            self.pokemon["Poke_Stats"].append(stats.poke_stats)

        def set_url(self, url):
            self.pokemon["URL"] = url

        def __str__(self):
            return str(self.pokemon)    


    class Poke_Abilities:
        def __init__(self):
            self.poke_abilities = {"Nome": "", "Speciale": ""}

        def set_abilita_nome(self, nome):
            self.poke_abilities["Nome"] = nome

        def set_abilita_speciale(self, speciale):
            self.poke_abilities["Speciale"] = speciale

        def __str__(self):
            return self.poke_abilities
    ...

    nomi = []
    special = []
    for j in pok["Poke_Abilities"]:
        nomi[j] = j["Nome"]
        special[j] = j["Speciale"]

这是错误:

nomi[j] = j["Nome"]
TypeError: list indices must be integers or slices, not dict

【问题讨论】:

  • 皮卡丘不可复制。你想要副本还是深副本?当您更改一个字典中的某些内容时,是否希望将更改反映在另一个字典中?定义新函数并返回 self.pokemon,然后可以初始化新的 Class 变量,将该字典作为参数传递并稍微更改 init
  • 什么是pok["Poke_Abilities"]?该错误意味着它是一个字典列表,因此j 是一个字典。
  • 您不能通过分配给索引来创建新的列表元素。您需要使用nomi.append(...)
  • @Barmar 感谢您的帮助。 Poke_Abilities 是一个字典, pok 是一个包含 Poke_Abilites 列表的口袋妖怪类对象。我需要将所有列表保存在一个新列表中,用它来节省机会,如果用户确认,则从新列表中重写第一个列表。我该怎么办?

标签: python list class


【解决方案1】:

为什么要创建一个包含所有其他 dict 属性的类?很抱歉这么说,但这是糟糕的设计而不是 pythonic。

你应该这样做:

class Pokemon:
    def __init__():
        self.name = ""
        self.specie = ""
        self.type = ""
        self.weight = ""
        self.height = 
        self.abilities = []
        self.stats = []
        self.url = ""

PokeAbilities 也是如此。 就是这样。没有设置方法。这不是pythonic。您可以像这样设置属性:

pokemon = Pokemon()
pokemon.name = "Pikachu"

或者通过向__init__函数添加和传递参数。

如果您在设置属性时需要更多控制,请使用properties

我不完全回答你的问题,但是一旦你做了一个好的设计,错误就会消失。

您还有其他选择,可以使用namedtuplesdataclasses

【讨论】:

    【解决方案2】:

    j 是一个字典,您不能将它用作nomespecial 中的列表索引。使用append() 将它们添加到列表中。

    for j in pok["Poke_Abilities"]:
        nome.append(j["Nome"])
        special.append(j["Speciale"])
    

    【讨论】:

    • 现在我使用 append() 将它们添加到列表中,但我不知道如何从最后 Poke_Abilities 中的 Nome 和 Speciale 复制回正确的元素
    • for i, n in enumerate(nome): pok['Poke_Abilities'][i].set_Poke_Name(n)
    • 你为什么要从对象中复制这些东西?
    猜你喜欢
    • 2018-08-22
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多