2014-07-25 52 views
0
class Enemy: 
    def __init__(self,name,health): 
     self.name=name 
     self.health=health 

wolf=Enemy('wolf',100) 
imp=Enemy('imp',70) 
orc=Enemy('orc',130) 
enemyList=[wolf,imp,orc] 

while 1: 
    enemyNumber=int(input("How many enemies are there? ")) 
    if enemyNumber in range(1,4): 
     break 
    else: 
     print('Wrong number') 

if enemyNumber<=2: 
    del enemyList[2] 
    if enemyNumber==1: 
     del enemyList[1] 

基本上我现在想的是能够以这样说:如何获得属性值的列表从类实例列表

attackTarget=None 
while not attackTarget in enemyList: 
     attackTarget=input('Which enemy do you want to attack? ') 
     if not attackTarget in enemyList: 
      wrongChoice() 

的问题是,我不有敌人名字的列表,但实例本身。我知道我可以喜欢的东西得到它:

enemyNameList=[] 
for i in range (enemyNumber): 
    enemyNameList.append(enemyList[i].name) 

,但不是有可以在while和if语句中使用,而无需创建一个全新的永久列表中选择一个更简单的方法?喜欢的东西enemyList.name

回答

2

您可以使用列表理解:

enemeyNameList = [enemy.name for enemy in List] 

这仍然创造了一个全新的列表,但这样做更concissely。

如果您尝试在不创建新列表的情况下执行此操作,可能会遇到各种效率低下的情况。由于您在while循环中重复测试,因此存储名称列表是有意义的。否则,每次通过循环时都必须反复查看每个敌人的名字。

+0

谢谢,那正是我一直在寻找的。如果我可能会有一个小小的问题:我注意到你在小括号内写了'敌人',并且用较低和较高的字体尝试过它,它工作正常。那么这是如何发生的呢?代码中没有任何地方提到小写字母,我认为这些东西都是区分大小写的。如果我尝试类似'goblin = enemy('goblin',150)'这样的话'NameError:name'enemy''not defined'。 – user3874806

+0

@ user3874806:列表理解将其定义为一个新变量。有关示例,请参阅[Python教程](https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions),您可以通过谷歌“Python列表理解”获取更多信息。 – BrenBarn