在Python中存储和比较多个属性

2024-10-03 04:27:49 发布

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

我试图建立一个幸存者游戏,将允许我比较存储的字符对彼此单独和作为一个部落的成员。我可以用一个属性来实现它,但是不能找到将它扩展到多个属性的最佳方法。你知道吗

示例:

TribeAStr = {'John': 50, 'Tyler': 55, 'Joe': 90, 'Bob': 55}

# check who is the strongest Survivor
$ strongest = max(TribeAStr, key=TribeAStr.get)

#Remove him from TribeA
del TribeAStr[strongest]

#Check how strong the Tribe is as a whole
$ tribeastrength = sum(TribeAStr.values())

我想做的是让每个幸存者拥有他们自己的属性,然后使用他们的名字作为一个键,然后可以拉入类似的场景,如上所述。像这样:

class Survivor:
    def __init__(self, name, str=None, int=None, cha=None, luk=None):
        self.name = name
        self.str = strength
        self.int = intelligence
        self.cha = charisma
        self.luk = luck

TribeA = {}
John = Survivor{'John', 50, 40, 55, 20}
Bob= Survivor{'Bob', 55, 40, 80, 25}
Joe= Survivor{'Joe', 60, 10, 65, 10}
Tyler= Survivor{'Tyler', 56, 30, 15, 25}
TribeA.update('John', 'Bob', 'Joe', 'Tyler')

# check who is the strongest Survivor
$ strongest = max(Survivor, Survivor.str) for Survivor in TribeA

有什么建议吗?你知道吗


Tags: thenameselfnone属性isjohnbob
3条回答

这应该起作用:

In [19]: class Survivor:
    ...:     def __init__(self, name, strength=None, intelligence=None, charisma=None, luck=None):
    ...:         self.name = name
    ...:         self.strength = strength
    ...:         self.intelligence = intelligence
    ...:         self.cha = charisma
    ...:         self.luk = luck

In [21]: TribeA = []
    ...: John = Survivor('John', 50, 40, 55, 20)
    ...: Bob= Survivor('Bob', 55, 40, 80, 25)
    ...: Joe= Survivor('Joe', 60, 10, 65, 10)
    ...: Tyler= Survivor('Tyler', 56, 30, 15, 25)
    ...: TribeA.extend([John, Bob, Joe, Tyler])

In [25]: strongest = max(TribeA, key=lambda x: x.strength)

In [26]: strongest.name
Out[26]: 'Joe'

要从TribeA中移除最强的玩家,请使用以下命令:

TribeA = list(filter(lambda x: x != strongest, TribeA))

# or going by name
# TribeA = list(filter(lambda x: x.name != strongest.name, TribeA))

第一个问题是语法错误:

John = Survivor{'John', 50, 40, 55, 20}

在Python中,调用构造函数就像调用普通函数一样,使用括号:

John = Survivor('John', 50, 40, 55, 20)

你的第二个问题是你不能仅仅用一个键列表来update一个dict;你需要用一个dict(或者一个键值对列表)来更新它。不然它怎么知道你想要什么价值观?所以:

TribeA.update({'John': John, 'Bob': Bob, 'Joe': Joe, 'Tyler': Tyler})

但实际上没有理由仅仅为了update而创建一个空的dict;只需一次性创建它:

TribeA = {'John': John, 'Bob': Bob, 'Joe': Joe, 'Tyler': Tyler}

如果每个名字要写两遍似乎是重复的,你可以通过使用听写理解来解决这个问题:

TribeA = {survivor.name: survivor for survivor in (John, Bob, Joe, Tyler)}

或者,也许您不想首先创建这些变量;您可以直接将对象存储在dict中:

TribeA = {}
TribeA['John'] = Survivor('John', 50, 40, 55, 20)
# etc.

你的第三个问题是你理解语法有误:

strongest = max(Survivor, Survivor.str) for Survivor in TribeA

你必须把整个理解放在传递给max的括号里。而且,你要按强度来分类,所以你要把强度放在第一位,而不是一对一对。最后,如果你的部族是一个dict,你不能只是在dict上循环,它只是给你钥匙。您需要在值上循环:

strongest = max((survivor.str, survivor) for survivor in TribeA.values())

但请注意,这不仅会给你最强大的幸存者,而且会给你两个值,最强大的幸存者的力量和幸存者。你可以扔掉你不想要的:

_, strongest = max((survivor.str, survivor) for survivor in TribeA.values())

…但使用键函数可能更好,如Sorting HOWTO中所述:

strongest = max(TribeA.values(), key=lambda survivor: survivor.str)

您可以定义用于确定Survivor的总体评级的方法,可能是所有属性的sum,并将其用作maxkey,以确定最强的Survivor

class Survivor:
    def __init__(self, name, str=None, int=None, cha=None, luk=None):
        self.name = name
        self.str = str
        self.int = int
        self.cha = cha
        self.luk = luk

    def overall(self):
        return sum(getattr(self, attr) for attr in ('str', 'int', 'cha', 'luk'))

John = Survivor('John', 50, 40, 55, 20)
Bob= Survivor('Bob', 55, 40, 80, 25)
Joe= Survivor('Joe', 60, 10, 65, 10)
Tyler= Survivor('Tyler', 56, 30, 15, 25)
TribeA = [John, Bob, Joe, Tyler]
strongest = max(TribeA, key=Survivor.overall)
print(strongest.name)

这将输出:

Bob

相关问题 更多 >