получить набор операторов из dict на python - PullRequest
0 голосов
/ 16 сентября 2018

Если у меня есть два или более наборов и строка, описывающая деоперацию, которая должна быть сделана между ними, например 'и', 'или', 'xor', это, очевидно, можно сделать так:

if string == 'and': 
    return set1.intersection(set2)
elif string == 'or'
    return set1 | set2

и так далее.Что делать, если я хочу сделать это со словарем?У меня что-то вроде этого:

dictionary = {'and': set.intersection, 'or': set.union}
return set1.dictionary[string](set2)

А также пробовал

operation = dictionary.get(string)
return set1.operation(set2)

Но ни один не работал.Как я могу достичь того же результата, который получаю через ifs, но с помощью словаря?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Вы можете попробовать attrgetter

from operator import attrgetter

set_methods = {"and": attrgetter("intersection"), 'or': attrgetter("union")}

Назовите это как: set_methods[method_string](set1)(set2).

0 голосов
/ 16 сентября 2018

Вы можете использовать set.itersection(), set.union() и т. Д. В качестве статических методов , передавая им несколько наборов:

>>> ops = {'and': set.intersection, 'or': set.union}
>>> set1 = {1, 2, 3}
>>> set2 = {3, 4, 5}
>>> ops['and'](set1, set2)
{3}
>>> ops['or'](set1, set2)
{1, 2, 3, 4, 5}

В качестве альтернативы, вы можете сопоставить операции с именами методови используйте getattr():

>>> ops = {'and': 'intersection', 'or': 'union'}
>>> getattr(set1, ops['and'])(set2)
{3}
>>> getattr(set1, ops['or'])(set2)
{1, 2, 3, 4, 5}
...