Reduce the length of words in a sentence
Review


Magic numbers

4 is a magic number, it is best to assign these to a variable name, that way it is more clear what this number means

numbers don't have names, variables do

MAX_WORD_LENGHT = 4

Use built-ins when possible


to_keep = word_length - to_cut
if to_keep &lt; 4:
to_keep = 4



Can be replaced with the max builtin

 to_keep = max(word_length - to_cut, 4)

Add tests

That way it becomes easy to check after a change if the function still works


Alternative

I went a slightly different route, 

Instead of joining after each word, I calculate the chars we need to cut beforehand

So we can keep a variable that will hold the amount of chars we still need to cut to reach our target

And only at the return join the words

import doctest

MAX_WORD_LENGHT = 4

def cut_everything(sentence, max_length):
    """
    reduces each word in sentence to a length of 4

    :type sentence: string
    :param sentence: the sentence to cut
    :type max_length: int
    :param max_length: the length to which the sentence will be reduced

    &gt;&gt;&gt; cut_everything('foo bar foooobar', 16)
    'foo bar foooobar'

    &gt;&gt;&gt; cut_everything('foo bar foooobar', 8)
    'foo bar fooo'

    &gt;&gt;&gt; cut_everything('foo bar foooobar baaarfoo', 20)
    'foo bar fooo baaarfo'

    &gt;&gt;&gt; cut_everything('fooooooo baaaaaaar foooobar baaarfoo', 2)
    'fooo baaa fooo baaa'
    """
    words = sentence.split()
    chars_to_cut = len(sentence) - max_length
    for index, word in enumerate(words):
        if chars_to_cut &lt; 0:
            break
        word_length = len(word)
        if word_length &gt; MAX_WORD_LENGHT:
            to_keep = max(word_length - chars_to_cut, MAX_WORD_LENGHT)
            words[index] = word[:to_keep]
            chars_to_cut -= word_length - to_keep
    return ' '.join(words)

if __name__ == '__main__':
    doctest.testmod()