字典被定义为“类型”的问题

2024-05-19 22:26:52 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在开发一款历史模拟游戏,我已经开始使用txt文件。你知道吗

不幸的是,我当前的程序没有定义字典,也没有运行__init__函数。你知道吗

nation = {
### Key : [Strength,Speed,Intelligence,Magic,Cosmic] ###
'Castile':[21,21.26,"De Tratsamana","Madrid",""],
'Aragon':[17,24.18,"De Tratsamana","Valencia",""],
'Portugal':[14,12.84,"De Avis","Lisbon",""],
'France':[27,20.75,"Valois","Paris",""],
'England':[27,31.42,"Lancaster","London",""],
'Austria':[15,16.48,"Hapsburg","Wien",""],
'Ottomans':[26,28.65,"Osmanoglu","Constantine",""],
'Venice':[15,16.79,"Elected position","Venezia",""],
'Poland':[18,14.87,"Jagellion","Krakow",""]
          }
#Placing the vaiables into a text file
myfile = open('nation.txt','w')
myfile.write('Castile' + '\n')
nationinfo1 = str(nation['Castile'])
myfile.write(nationinfo1 + '\n')
myfile.write('Aragon' + '\n')
nationinfo2 = str(nation['Aragon'])
myfile.write(nationinfo2 + '\n')
myfile.write('Portugal' + '\n')
nationinfo3 = str(nation['Portugal'])
myfile.write(nationinfo3 + '\n')
myfile.write('France' + '\n')
nationinfo1 = str(nation['France'])
myfile.write(nationinfo1 + '\n')
myfile.write('England' + '\n')
nationinfo2 = str(nation['England'])
myfile.write(nationinfo2 + '\n')
myfile.write('Austria' + '\n')
nationinfo3 = str(nation['Austria'])
myfile.write(nationinfo3 + '\n')
myfile.write('Ottomans' + '\n')
nationinfo1 = str(nation['Ottomans'])
myfile.write(nationinfo1 + '\n')
myfile.write('Venice' + '\n')
nationinfo2 = str(nation['Venice'])
myfile.write(nationinfo2 + '\n')
myfile.write('Poland' + '\n')
nationinfo3 = str(nation['Poland'])
myfile.write(nationinfo3 + '\n')
myfile.close()

class nation():       
     def __init__(r1,nation):
          #Hero's nation is the key ie. Iron Man or Thor
          r1.nation = input("Please enter nation the name of the Nation")
          #attributes are the items in the dictionary
          r1.army = nation[r1.nation][0]
          r1.money = nation[r1.nation][1]
          r1.dynasty = nation[r1.nation][2]
          r1.capital = nation[r1.nation][3]
          r1.marries = nation
          #prints all nation information
          print('nation :',r1.nation,'\nArmy Size:',r1.army,'\nDucat Treasury:',r1.money,'\nDynasty :',r1.dynasty ,'\nCapital :',r1.capital,)

Tags: thedemyfilewriter1strfrancenation
1条回答
网友
1楼 · 发布于 2024-05-19 22:26:52

对于初学者来说,这并不是一个常见的问题:尝试仅使用您所知道的和可以从文档中猜测的内容来创建新的功能是很困难的,而这些文档并不总是与初学者一起编写的。不幸的是,有经验的程序员往往会留下这样的问题,所以有些评论可能显得过于简练。正如在评论中所指出的,你的名字有一些问题,我将在接下来的工作中帮助你解决这些问题。你知道吗

我从您的代码中得知,您希望创建Nation对象(我将名称大写,因为在Python中这样表示类名是很常见的),每个对象的属性在注释中称为强度、速度、智能、魔法和宇宙,但在代码中称为armymoneydynastycapital。我无法完全推断宇宙和married应该在做什么,所以我只能希望下面的内容能够充分解释,如果我错了,你可以自己解决这个问题。你知道吗

我希望你已经看到,对同一件事有不同的名字是令人困惑的。对于不同的事物用同一个名字更让人困惑,但作为一个初学者,我明白在你的头脑中很难准确地理解哪个名字指的是什么物体。如果有什么安慰的话,我的哥哥,一个数学家,远远超出了我的能力,他目前在学习Python的过程中遇到了类似的问题。但是,考虑到这一点,nation这个名字在您的代码中似乎确实有点过度使用了。你知道吗

使用交互式输入初始化类本身是不常见的,您可能会接受这样的观点:编写这样操作的程序不是一个好主意。由于您试图写出每个国家的详细信息,因此我假设您希望为每个国家创建一个对象,并将其详细信息打印到文件中。如果这是错误的,那么我很抱歉-下一次,请在问题中包括您希望的描述;-)

让我们从数据开始,您将看到我更改了它的名称,以反映它包含所有国家数据的事实:

nation_data = {
    ### Key : [Strength,Speed,Intelligence,Magic,Cosmic] ###
    'Castile':[21,21.26,"De Tratsamana","Madrid",""],
    'Aragon':[17,24.18,"De Tratsamana","Valencia",""],
    'Portugal':[14,12.84,"De Avis","Lisbon",""],
    'France':[27,20.75,"Valois","Paris",""],
    'England':[27,31.42,"Lancaster","London",""],
    'Austria':[15,16.48,"Hapsburg","Wien",""],
    'Ottomans':[26,28.65,"Osmanoglu","Constantine",""],
    'Venice':[15,16.79,"Elected position","Venezia",""],
    'Poland':[18,14.87,"Jagellion","Krakow",""]
}

循环遍历字典中的所有键非常简单(尽管您不能假设它们以任何特定的顺序出现),如下所示。在这个循环中,我只是打印出力量和资本:

for nation_name in nation_data:
    nation = nation_data[nation_name]
    print(nation_name, nation[0], nation[3])

在我的系统里这个指纹

Castile 21 Madrid
Aragon 17 Valencia
Portugal 14 Lisbon
France 27 Paris
England 27 London
Austria 15 Wien
Ottomans 26 Constantine
Venice 15 Venezia
Poland 18 Krakow

但我不能保证你的订单是一样的。我相信我们可以同意,但是像nation[0]这样的术语并不能真正帮助读者理解正在使用的数据。类的一个真正的优点是,它们允许您按名称引用对象的数据(通常称为属性)。你知道吗

因此,下一个问题是如何将列表中的每个项转换为对象。这里我假设,既然我已经演示了如何生成所有的国家名称,就不需要在类的__init__方法中执行任何输入,因为国家名称可以是该方法的参数。实际上,这是一个非常常见的Python习惯用法:在调用类时传递一组参数,这样__init__方法就可以将它们存储为实例属性。在您的特殊情况下,这将使类看起来像下面的内容。 您将看到该类只有两个方法。对象的__str__方法在请求其字符串值时被调用。我给了married参数__init__一个默认值,所以如果你不想创建一个新的国家,你不需要提供一个值。你知道吗

class Nation:
    "Represent what's important about a nation."
    def __init__(self, name, army, money, dynasty, capital, married=""):
        "Initialise the instance attributes."
        self.name = name
        self.army = army
        self.money = money
        self.dynasty = dynasty
        self.capital = capital
        self.married = married
    def __str__(self):
        return "Nation: {}: Army: {}; Money: {}; Dynasty: {}; Capital: {}; Married: {}".format(
                self.name, self.army, self.money, self.dynasty, self.capital, self.married)

我现在可以创建一个国家并出版它。你应该发现这个代码

n1 = Nation("Bitgravia", 20, 200, "Tang", "Information City")
print(n1)

印刷品

Nation: Bitgravia: Army: 20; Money: 200; Dynasty: Tang; Capital: Information City; Married:

了解所有这些,创建Nation实例是一项非常简单的任务。要将这些存储在名为nations的dict中(这似乎是一个合理的名称,因为它存储了Nation对象),您可以编写:

nations = {}
for name, data in nation_data.items():
    nations[name] = Nation(name, data[0], data[1], data[2], data[3], data[4])

事实上,Python的开发人员已经预料到需要通过每个一个列表的成员作为一组参数,因此同样的代码可以更简洁地写成

nations = {}
for name, data in nation_data.items():
    nations[name] = Nation(name, *data)

无论是哪种实现

for nation in nations.values():
    print(nation)

渲染

Nation: Castile: Army: 21; Money: 21.26; Dynasty: De Tratsamana; Capital: Madrid; Married: 
Nation: Aragon: Army: 17; Money: 24.18; Dynasty: De Tratsamana; Capital: Valencia; Married: 
Nation: Portugal: Army: 14; Money: 12.84; Dynasty: De Avis; Capital: Lisbon; Married: 
Nation: France: Army: 27; Money: 20.75; Dynasty: Valois; Capital: Paris; Married: 
Nation: England: Army: 27; Money: 31.42; Dynasty: Lancaster; Capital: London; Married: 
Nation: Austria: Army: 15; Money: 16.48; Dynasty: Hapsburg; Capital: Wien; Married: 
Nation: Ottomans: Army: 26; Money: 28.65; Dynasty: Osmanoglu; Capital: Constantine; Married: 
Nation: Venice: Army: 15; Money: 16.79; Dynasty: Elected position; Capital: Venezia; Married: 
Nation: Poland: Army: 18; Money: 14.87; Dynasty: Jagellion; Capital: Krakow; Married: 

如果重要的话,剩下的就是确保城市按要求的顺序出现(按照你想要的顺序建立一个城市列表,遍历该列表并使用这些名称在nations中查找相关项,然后将数据写入文件(一种方法是添加一个Nation.write方法,该方法将文件作为参数,并将str(self)写入文件,后跟换行符)。你知道吗

我希望这能帮助你理解你问题的结构化答案是什么样的。像往常一样,我做了其他人可能会做出不同的选择,但总的来说,这是一个相当“Pythonic”的方法来解决你的问题。你知道吗

后来我意识到我应该指出,既然国家包含他们的名字,除非你真的需要按名字查找,否则就要列出一份世界各国的名单。所以你也可以写

nations = []
for name, data in nation_data.items():
    nations.append(Nation(name, *data))

这样可以简化打印代码

for nation in nations:
    print(nation)

相关问题 更多 >