Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 词典定义为“的问题”;“类型”;_Python_Dictionary - Fatal编程技术网

Python 词典定义为“的问题”;“类型”;

Python 词典定义为“的问题”;“类型”;,python,dictionary,Python,Dictionary,目前,我正在开发一款历史sim卡游戏,我已经开始使用txt文件 不幸的是,我当前的程序没有定义字典,也没有运行\uuuu init\uuu函数 nation = { ### Key : [Strength,Speed,Intelligence,Magic,Cosmic] ### 'Castile':[21,21.26,"De Tratsamana","Madrid",""], 'Aragon':[17,24.18,"De Tratsamana","Valencia",""], 'Portugal

目前,我正在开发一款历史sim卡游戏,我已经开始使用
txt
文件

不幸的是,我当前的程序没有定义字典,也没有运行
\uuuu init\uuu
函数

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,)

对于初学者来说,这并不是一个不常见的问题:尝试仅使用您所知道的和可以从文档中猜测的内容来创建新功能可能会很困难,而这些文档并非总是针对初学者编写的。不幸的是,有经验的程序员往往会把这类问题抛在脑后,因此一些评论可能显得过于简练。正如评论中所指出的,您的命名存在一些问题,我将在继续讨论时帮助您解决这些问题

我从您的代码中推测,您希望创建
Nation
对象(我将名称大写,因为在Python中以这种方式表示类名很常见),每个对象的属性在注释中称为强度、速度、智能、魔法和宇宙,但在代码中称为
army
money
王朝
首都
。我无法完全推断出宇宙和已婚夫妇应该做什么,所以我只能希望下面的内容能够充分解释,如果我错了,你可以自己解决这个问题

我希望你已经看到,同一件东西有不同的名字是令人困惑的。对于不同的事物使用相同的名称更令人困惑,但作为一个初学者,我理解在你的头脑中很难准确地理解哪个名称指的是什么对象。如果有什么安慰的话,我的兄弟,一个远远超出我能力范围的数学家,在学习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]
这样的术语并不能真正帮助读者理解正在使用的数据。类的一个非常好的地方是,它们允许您按名称引用对象的数据(通常称为属性)

因此,下一个问题是如何将列表中的每个项目转换为对象。在这里,我将假设,由于我已经演示了如何生成所有国家名称,因此不需要在类的
\uuuuu init\uuuu
方法中执行任何输入,因为国家名称可以是该方法的参数。事实上,这是一个非常常见的Python习惯用法:在调用类时传递一组参数,以便
\uuuu init\uuu
方法可以将它们存储为实例属性。在您的特殊情况下,这将使类看起来像下面的内容。 您将看到该类只有两个方法。当您请求对象的字符串值时,将调用该对象的
\uuu\str\uu
方法。我为
\uuuu init\uuuu
提供了
已婚
参数的默认值,因此如果您不想创建一个新国家,您不必提供值

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
实例是一项非常简单的任务。要将这些存储在名为
国家
的dict中(这似乎是一个合理的名称,因为它存储国家对象),您可以编写:

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: 
如果重要的话,剩下的就是确保城市按要求的顺序出现(按照您想要的顺序建立一个城市列表,迭代该列表,并使用名称在
国家中查找相关项目),并将数据写入您的文件(一种方法是添加一个
Nation.write
方法,该方法将一个文件作为参数,并将
str(self)
写入该文件,后跟一个换行符)

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

后来我意识到我应该指出,由于国家包含它们的名字,除非你真的需要按名字查找它们,否则你也可以写一份世界服务国家的名单

nations = []
for name, data in nation_data.items():
    nations.append(Nation(name, *data))
这将使打印代码简化为

for nation in nations:
    print(nation)

您有一个名为
nation
的变量和一个名为
nation
的类。您知道这是怎么一个问题吗?您定义类后是否调用过
nation()
?还要注意,由于类和字典都称为nation,因此您无法访问字典更改dict名称“nation”或类对象“nation”。如果您试图调用该类或该类的方法,我想您会得到一个类型错误,因为它可能试图调用变量,这在Python中是不可能的,从而导致类型错误。此外,Python中的惯例是使用
self