将字典定义为" type"

时间:2018-03-12 21:51:27

标签: python dictionary

目前,我正在开发历史模拟游戏,我已经开始使用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,)

1 个答案:

答案 0 :(得分:0)

对于初学者来说,这不是一个不常见的问题:尝试使用您所知道的内容创建新功能,并且可以从难以用初学者编写的文档中猜测。不幸的是,这是有经验的程序员往往会留下的问题,所以有些评论可能看起来没有用。如评论中所示,您的命名存在一些问题,我将在接下来尝试帮助解决这些问题。

我从您的代码中想要创建Nation个对象(我将这个名称大写,因为它在Python中很常见,以此表示类名),每个都有引用的属性。评论为力量,速度,智力,魔法和宇宙,但代码为armymoneydynastycapital。我无法推断出Cosmic和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]这样的术语并不能帮助读者理解正在使用的数据。关于类的真正好的事情之一是它们允许您按名称引用对象的数据(通常称为属性)。

接下来的问题是如何将列表中的每个项目转换为对象。在这里,我将假设,因为我已经演示了如何生成所有nation_names,所以在类__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: 

所有剩下的,如果重要的话,是确保城市以所需的顺序出现(按照您想要的顺序构建它们的列表,迭代该列表并使用名称在{{中查找相关项目) 1}})并将数据写入您的文件(一种方法是添加一个nations方法,该方法将文件作为参数并将Nation.write写入文件后跟换行符。

我希望这有助于您了解问题的结构化答案。像往常一样,我做出了其他人可能做出不同选择的选择,但总的来说,这是一个相当的" Pythonic"解决问题的方法。

我后来意识到我应该指出,因为各国都有他们的名字,除非你真的需要通过名字来查找他们的国家名单。所以你也可以写

str(self)

这将简化打印代码

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