2014-07-25 77 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