The main line that does the execution is here:
print(converters[option](leng1))
It is fetching the value from converters, which is a lamdba (a function you can write as an expression), and then calls it with the value entered by the user.
Here is a simplified example, because this is the main part that did the "shrinking" of your code.
Lets say you have two methods, a and b, and depending on what the user selects, you have to call either a or b. You might write some code like this:
def a():
return 'Hello'
def b():
return 'Goodbye'
user_request = input('Please enter either a or b: ')
if user_request == 'a':
print(a())
if user_request == 'b':
print(b())
This is fine if its two options, but what if there are 3, 4 or 9 options? Now you'll end up with a large chain of if/else statements. To prevent this, what you can do is use a call map - which is a dictionary that has the values as the method names:
call_map = dict()
call_map['a'] = a
call_map['b'] = b
As methods are just like normal values, you can assign and pass them around. Now what you want to do is call the method that corresponds to the input:
option = 'a'
function_to_call = call_map[option]
result = function_to_call()
You can shorten the above with:
result = call_map[option]()
As the dictionary only has keys for those values that map to valid functions, it is easy to filter out an invalid entry - it simply won't be in the list of keys for that dictionary.
if option not in call_map.keys():
print('{} is not a valid option'.format(option))
else:
print('The result is: {}'.format(call_map[option]())