2015-10-23 66 views
1

我正在做一個黑客問題,我解決了它,但使用了一些我認爲非常不合理的東西。是否有可能將字典映射到Python中的對象操作

所以,這個想法是解析一個行,它給你一個命令和列表上的操作,並在列表中執行它。我結束了這個難看的if/else邏輯:

l = [] 
num_commands = int(raw_input()) 

for i in range(num_commands): 
    current = raw_input().split()  
    if current[0] == 'insert': 
     params = map(int, current[1:]) 
     l.insert(params[0], params[1]) 

    elif current[0] == 'print': 
     print l 

    elif current[0] == 'sort': 
     l.sort() 

    elif current[0] == 'pop': 
     l.pop() 

    elif current[0] == 'reverse': 
     l.reverse()  

    elif current[0] == 'remove': 
     l.remove(int(current[1])) 

    elif current[0] == 'append': 
     l.append(int(current[1])) 

這是醜陋的,但它的工作原理。我想知道是否有更好的方法來做同樣的事情,可能使用一些字典查找,它將字符串綁定到某個特定對象實例的某個成員函數上?

回答

4

函數(和方法)都可以引用,是的。您可以在列表對象上創建一個方法字典,例如lookup = {'remove': l.remove},然後可以與lookup['remove'](val)一起使用。

此外,還可以通過使用getattr檢索與字符串對象的屬性:

getattr(alist, 'remove')(val) 
+0

只是一個建議,如果你在創建你的字典時沒有'l',你可以使用'{'remove':lambda l,i:l.remove(i)}'或類似的方法來刪除依賴於變量名 – user2085282

+0

@ user2085282 - 是的,但是你必須用'lookup ['remove'](alist,val)''調用它。如果修改了多個列表,那麼也可以工作,但如果它總是單個列表,則用戶正在修改發佈的解決方案的工作原樣。 –

+0

哇,這很酷!謝謝! – Luca

相關問題