在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

有什么建议吗?

您的第一个问题是语法错误:

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

但实际上没有理由仅仅为了updateit而创建一个空dict;只需一次创建即可:

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

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

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

……但可能最好使用一个关键函数,如排序HOWTO:中所述

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

这应该有效:

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 = list(filter(lambda x: x != strongest, TribeA))
# or going by name
# TribeA = list(filter(lambda x: x.name != strongest.name, TribeA))

您可以定义一种用于确定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

相关内容

  • 没有找到相关文章

最新更新