Для произвольных изображений из набора в другой, я бы использовал словарь Python.Например, f (n) = n ^ 2 на наборе {1,2,3,4}, я могу сделать это:
preimage = set([1,2,3,4])
mapping = {x: x*x for x in preimage}
image = set(mapping.values())
assert set(mapping.keys()) == preimage
function = lambda x: mapping[x] # so you can now have y = function(x)
check_image = set([function(x) for x in preimage])
assert check_image == image
Конечно, это работает, только если ваш конечный набордействительно ограничен по отношению к имеющейся у вас памяти.
Выше приведен наиболее общий случай, когда вы определяете функцию как отображение.Но в случае более простой функции, которую вы можете использовать в выражении Python для ее представления, вы можете пропустить словарь:
preimage = set([1,2,3,4])
function = lambda x: x*x
image = set([function(x) for x in preimage])
check_preimage = set([y for x in image for y in preimage if function(y)==x])
assert check_preimage == preimage
И если далее, у вас есть обратная функция, доступная для домена:
import math
preimage = set([1,2,3,4])
function = lambda x: x*x
inv_func = lambda x: int(math.sqrt(x))
image = set([function(x) for x in preimage])
check_preimage = set([inv_func(x) for x in image])
assert check_preimage == preimage
Обратите внимание, что из трех приведенных выше фрагментов кода только первый гарантирует, что function(x)
разрешит только те x
в предопределенном прообразе.
Говоря об идиомальном питоне: я не понимаюЯ не думаю, что Python действительно такой математический язык (сравните, скажем, математику Вольфрама), поэтому у нас нет встроенной концепции изображения, отображения и т. д.Тем не менее, вы можете увидеть мой код выше с пониманием списка.В самом деле, я просто сделал более понятным использование ключевого слова set
, как в set([function(x) for x in preimage])
, но вы можете сохранить несколько нажатий клавиш с помощью {function(x) for x in preimage}
.