Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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 类uuu init_uuu中的增量字典值?_Python_Class_Dictionary - Fatal编程技术网

Python 类uuu init_uuu中的增量字典值?

Python 类uuu init_uuu中的增量字典值?,python,class,dictionary,Python,Class,Dictionary,我试图创建一个类,该类获取投票问题和投票选项,并返回元组列表中每个选项的总投票数。但是,我无法使用在uu init_uuu中设置的字典来保留以前实例的投票 这是我的密码: class Poll: def __init__(self, question, options): self.question = question self.options = options self.votes = {} def vote(self, o

我试图创建一个类,该类获取投票问题和投票选项,并返回元组列表中每个选项的总投票数。但是,我无法使用在uu init_uuu中设置的字典来保留以前实例的投票

这是我的密码:

class Poll:
    def __init__(self, question, options):
        self.question = question
        self.options = options
        self.votes = {}

    def vote(self, option):
        if option in self.votes:
            self.votes[option] += 1
        else: 
            self.votes[option] = 1
        return True

    def get_votes(self):
        vote_list = [(key, value) for key, value in self.votes.items()]
        return vote_list


vote_1 = Poll("What is your favorite fruit?", ["Apple", "Banana"])
vote_1.vote("Apple")
vote_2 = Poll("What is your favorite fruit?", ["Apple", "Banana"])
vote_2.vote("Banana")
vote_3 = Poll("What is your favorite fruit?", ["Apple", "Banana"])
vote_3.vote("Apple")
print(vote_1.get_votes())
print(vote_2.get_votes())
print(vote_3.get_votes())
这就是我得到的:

[('Apple', 1)]
[('Banana', 1)]
[('Apple', 1)]
这就是我想要得到的:

[('Apple', 1]
[('Apple', 1), ('Banana', 1)]    
[('Apple', 2), ('Banana', 1)]
我无法将“投票”函数设置为返回投票,因为它必须返回True


我想我需要另一个函数来保存字典,但我不确定如何操作。

代码几乎正确。Poll类本身很好,但是您将为每次投票分别实例化它,而不是每次都在同一实例上调用vote方法。您需要做的就是:

poll = Poll("What is your favorite fruit?", ["Apple", "Banana"])
poll.vote("Apple")
print(poll.get_votes())
poll.vote("Banana")
print(poll.get_votes())
poll.vote("Apple")
print(poll.get_votes())

尽管您也可以考虑使用循环,而不是重复代码:

poll = Poll("What is your favorite fruit?", ["Apple", "Banana"])
for option in "Apple", "Banana", "Apple":
    poll.vote(option)
    print(poll.get_votes())
顺便说一句,我想向Poll类建议的一个改进,尽管与问题没有直接关系,但就是除了将选项分配给self.options之后,这些选项并没有真正被使用。您可以在投票方法中使用它来强制人们不要对不属于选项之一的内容进行投票。例如,如果该方法以以下内容开头:

    def vote(self, option):
        if option not in self.options:
            raise ValueError("you are not allowed to vote on {}"
                             .format(option))        
        # do other stuff
然后在使用以下命令实例化之后:

poll = Poll("What is your favorite fruit?", ["Apple", "Banana"])
你做到了:

poll.vote("Cheese")

然后这将引发异常。

您正在创建单独的轮询实例。您需要一个投票实例,然后将所有三张投票添加到同一个投票中。@alaniwi谢谢。我需要一次投一票。这就是练习的设计方式。FWIW,您可以简化get_votes:return listself.votes。items@clnns45如果您愿意,您仍然可以在每次投票后调用get_Voces。我编辑了我的答案来反映这一点。另外,你可以研究一下简化课堂的最常见的方法。并且Poll.vote可能应该在self.options中检查该选项。非常感谢,更改实例的创建已经完成了这项任务!