2010-01-28 86 views
7

我可以使用變量引用namedtuple fieldame嗎?Python:使用namedtuple._replace和變量作爲字段名稱

from collections import namedtuple 
import random 

Prize = namedtuple("Prize", ["left", "right"]) 

this_prize = Prize("FirstPrize", "SecondPrize") 

if random.random() > .5: 
    choice = "left" 
else: 
    choice = "right" 

#retrieve the value of "left" or "right" depending on the choice 

print "You won", getattr(this_prize,choice) 

#replace the value of "left" or "right" depending on the choice 

this_prize._replace(choice = "Yay") #this doesn't work 

print this_prize 

回答

14

元組是不可變的,因此是NamedTuples。他們不應該被改變!

this_prize._replace(choice = "Yay")使用關鍵字參數"choice"調用_replace。它不使用choice作爲變量,並嘗試用choice的名稱替換字段。

this_prize._replace(**{choice : "Yay"})將使用任何choice是字段名

_replace返回一個新NamedTuple。你需要重新分配它:this_prize = this_prize._replace(**{choice : "Yay"})

只需使用一個字典或寫一個普通的類!

+0

耶!這就是我需要知道的。謝謝 – 2010-01-28 20:38:45

+0

我試圖優化數據結構的速度。 我一直希望能使用namedtuples,但我必須改變它們。也許我將不得不使用別的東西。見: http://stackoverflow.com/questions/2127680/python-optimizing-or-at-least-getting-fresh-ideas-for-a-tree-generator – 2010-01-28 21:14:39

+0

我有一個情況,我不會改變最的元組,但只有其中的幾個,所以'_replace'是要走的路。這個答案幫了我很多(比官方文檔更多)。 – JulienD 2016-01-02 17:51:57

2
>>> choice = 'left' 
>>> this_prize._replace(**{choice: 'Yay'})   # you need to assign this to this_prize if you want 
Prize(left='Yay', right='SecondPrize') 
>>> this_prize 
Prize(left='FirstPrize', right='SecondPrize')   # doesn't modify this_prize in place 
+0

感謝您的回覆。我明白你的意思了。 – 2010-01-28 20:39:54

+1

但是真的,你爲什麼使用這個命名的元組?這聽起來像你想要一個字典。 – jcdyer 2010-01-28 20:54:26

相關問題