2015-10-23 2 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

Смежные вопросы