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

2024-09-24 22:24:41 发布

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

我正在用Python2.7制作一个TBRPG游戏,目前正在制作一个任务系统。我想创建一个函数来检查列表中的所有任务,在本例中是(quests),并告诉您列表中的任何任务是否具有相同的ID或名称,如果它们具有相同的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)

我不知道怎么做。你知道吗


Tags: nameselfidtargetdefmultipleitemlevel
3条回答

你的任务类看起来像god object。你知道吗

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

看看需要多少投入。你知道吗

您应该尝试隔离它的关注点,并将其划分为更多的类。你知道吗

一个类应该只有一个关注点。你知道吗

也许你应该分给另一个班。你知道吗

另外,把客观要求分门别类也很有意义。甚至,一个类对应一个需求,然后简单地将客观需求列为一个需求列表。你知道吗

因此,您可以声明需要满足列表中的所有需求。但是每个需求都可以包含替代的需求,例如,将项目A交给人A或人B。让需求类处理or,而任务类处理and。你知道吗

一旦你关闭了任务类,你应该创建一个QuestFactory,它创建任务,创建一个任务应该检查没有其他具有相同id或相同名称的任务,或者计算有多个任务等等

如果您绝对想计算相同id/名称的出现次数,请不要重新设计轮子,使用类似pandas或类似的python数学库。你知道吗

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

获取重复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

你可以创建一个set来保存不同的id,然后将该集合的大小与任务总数进行比较。区别告诉你有多少个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即可打印该任务的所有细节。你知道吗

相关问题 更多 >