如何检查列表中的多个属性

时间:2015-06-22 11:45:27

标签: python python-2.7

我正在使用Python 2.7制作TBRPG游戏,而且我目前正在制作一个任务系统。我想创建一个函数来检查列表中的所有任务,在这种情况下(quests),并告诉您列表中的任何任务是否具有相同的ID或名称,如果他们这样做multiple_idmultiple_names将上升1.

class Quest:
    def __init__(self, target, name, ID, required_level, objective_requirements, reward_gold, reward_exp, reward_item):
        self.target = target
        self.name = name
        self.ID = ID
        self.req_level = required_level
        self.objective_default = 0
        self.objective_req = objective_requirement
        self.reward_gold = reward_gold
        self.reward_exp = reward_exp
        self.reward_item = reward_item

    def accept(self):
        if self.target.level >= self.req_level:
            self.target.quest.append(self.ID)
        else:
            pass

    def turn_in(self):
        if self.reward_exp >= 0:
            self.target.exp += self.reward_exp
            print '...'
        if self.reward_gold >= 0:
            self.target.gold += self.reward_gold
            print '...'
        if self.reward_item == None:
            pass
        else:
            self.target.inventory.append(self.reward)
            print '...'

def test_quests(list):
    multiple_id = 0
    multiple_names = 0
    for x in list[:]:
        print 'ID ' + str(x.ID)
        print 'Name ' + x.name
        print 'Target ' + str(x.target)
        print 'Required Level ' + str(x.req_level)
        print 'Objective Default ' + str(x.objective_default)
        print 'Objective Requirement ' + str(x.objevtive_req)
        print 'Reward Gold ' + str(x.reward_gold)
        print 'Reward Exp ' + str(x.reward_exp)
        print 'Reward Item' + str(x.reward_item)

    print "Multiple ID's found = %d" % multiple_id
    print "Multiple Name's found = %d" % multiple_names

me = 'Just a filler ATM...'
Quest1 = Quest(me, 'A Simple Task', 001, 0, 1, 100, 20, None)
Quest2 = Quest(me, 'A Difficult Task', 702, 0 , 1, 0 ,0, None)

quests = [Quest1, Quest2]
test_quests(quests)

我不知道如何做到这一点。

3 个答案:

答案 0 :(得分:0)

您可以创建一个包含不同ID的set,然后将该组的大小与任务总数进行比较。差异告诉您重复的ID数量。名字相同。

像这样(未经测试):

def test_quests(quests):
    num_total = len(quests)
    different_ids = len(set((q.ID for q in quests)))
    different_names = len(set((q.name for q in quests)))
    print "Multiple ID's found = %d" % (num_total - different_ids)
    print "Multiple Name's found = %d" % (num_total - different_names)

此外,实施Quest.__repr__和/或Quest.__str__可能是一个好主意,因此您只需执行print some_quest即可打印该任务的所有详细信息。

答案 1 :(得分:0)

获取重复的ID /名称数量:

id_set = set(map(lambda x: x.ID, quests))
name_set = set(map(lambda x: x.name, quests))
multiple_id = len(quests) - len(id_set)
multiple_names = len(quests) - len(name_set)

如果您想获得每个ID /名称的现有时间,可以在上面的代码中使用collection.Counter代替 set

答案 2 :(得分:0)

您的Quest类看起来像god object

class Quest:
    def __init__(self, target, name, ID, required_level, objective_requirements, reward_gold, reward_exp, reward_item):

查看需要多少输入。

您应该尝试隔离其关注点并将其拆分为更多类。

一个班级应该只有一个问题。

也许你应该把奖励分给另一个班级。

将目标要求分解为单独的课程也是有道理的。或者甚至是一个要求的类,然后简单地将客观要求列为需求列表。

因此,您可以声明需要满足列表中的所有要求。但是每个要求都可以包含备用要求,例如,将项目A给予人员A或给予人员B.让需求类处理或者,并且任务类处理和。

一旦你关闭了Quest类,你应该创建一个QuestFactory来创建任务并创建一个任务应该检查没有其他任务具有相同的id或相同的名称,或者计数那里是多个等。

如果你绝对想要计算同一个id / name的出现次数,不要重新发明轮子,请使用python数学库,如pandas或类似的东西。

import pandas as pd

df = pd.DataFrame("ID":[x.id for x in quests], "Name":[x.name for x in quests])
print df.ID.value_counts()
print df.Name.value_counts()