2009-12-11 139 views
0

讓我們假裝我有以下代碼。簡化小代碼示例

num1 = 33 
num2 = 45 
num3 = 76 
lst = ['one', 'two', 'three'] 

for item in lst: 
    if item == 'one': 
     print num1 
    elif item == 'two': 
     print num2 
    elif item == 'three': 
     print num3 

當列表和打印語句之間沒有關聯時,有沒有辦法讓這更優雅?意思是說,有沒有辦法擺脫ifs和elifs?

+5

你的代碼真的是什麼?沒有要求,沒有編碼。 – linjunhalida 2009-12-11 12:23:07

+0

如果元素與任何if子句不匹配,你的代碼應該做什麼?正如你寫的那樣,它只是忽略了那個元素。那是故意的嗎? – 2009-12-11 13:41:23

+0

我只是想看看是否有某種不好的循環遍歷列表和數字的pythonic方式。最後,我猜字典可能是最好的方法。 是的,這是故意的。我知道所有不同的可能性,所以我不需要其他的選擇,因爲沒有其他選擇。 – Orjanp 2009-12-11 17:37:20

回答

5

你當然也可以使用字典,查找響應:

lst = ['one', 'two', 'three'] 
resp = { 'one': num1, 'two': num2, 'three': num3 } 

for item in lst: 
    print resp[item] 

這仍然是相當靜態的,但。另一種方法是以對象爲導向,所以你可以在作出決定的對象lst中實現一個函數。

5
>>> tups = ('one', 33), ('two', 45), ('three', 76) 
>>> for i, j in tups: 
    print(j) 


33 
45 
76 
4

是否有意讓您的代碼忽略任何if/elif子句中未提及的對象?如果是這樣,使用字典與「無」的默認值,如果該對象未找到:

lst = ['one', 'two', 'three'] 
d = { 'one': 33, 'two': 45, 'three': 76} 

for item in lst: 
    x = d.get(item) 
    if x is not None: 
     print x 
+1

我想你的意思是'如果x不是無' – 2009-12-11 13:42:12

+0

哎呀,謝謝!這就是爲什麼測試所有代碼是一個好主意,即使它非常簡單! – 2009-12-11 13:43:51

+0

是的,這是內涵。 – Orjanp 2009-12-11 17:38:51

2

你的整個邏輯的if/else相當於一本字典的鍵和值對

d = {"one":33, "two":44, "three":76} 

代碼

if item == 'one': 
    print num1 

,這部分是一樣的

print d["one"] 

像明智的人

1

如果你有字典是這樣的:

d = {"one":33, "two":44, "three":76} 

您可以打印它像這樣:

for k in d.keys(): 
    print d[k] 

這假定你不關心順序。

1

對於你的簡單例子,在其他答案中出現的字典查找是最好的。但有時你需要爲每個條件運行完全不同的代碼,所以下面的語句可能是太有用:當有if子句和印刷之間沒有相關性

class MyClass(object): 

    def process(self, item): 
     # Select the method to call based on item value 
     return getattr(self, 'do_'+item)() 

    def do_one(self): 
     # do something here 

    def do_two(self): 
     # do something other here 

    # ... other methods ... 
1

,您可以創建一個映射字典存儲相關性。你需要小心映射到numx的變量,而不是當前值(因此使用eval函數的):

num1 = 33 
num2 = 45 
num3 = 76 
lst = ['one', 'two', 'three'] 

map = {'one': 'num1', 'two': 'num2', 'three': 'num3'} 

for item in lst: 
    print item in map and eval(map[item]) or 'Unknown' 

如果你確定該項目在地圖上,最後一行可以進一步簡化爲:

print eval(map[item])