[Tutor] feedback on permutations script

Isaac hyperneato at gmail.com
Sun Jul 11 01:10:14 CEST 2010


Thanks, I will look at the source of itertools.permutations to learn
how it is done. I want to learn more about how to write algorithms
well. Looking at the source and asking questions as they come up is a
great idea.

On Sat, Jul 10, 2010 at 3:37 PM, Shashwat Anand
<anand.shashwat at gmail.com> wrote:
>
>
> On Sat, Jul 10, 2010 at 10:18 PM, Isaac <hyperneato at gmail.com> wrote:
>>
>> This is my interpretation of an algorithm to generate all permutations
>> of items in a list. I would appreciate any feedback regarding advice
>> for improvements.
>
> Why not try itertools.permutation
>
>>
>> Thank you,
>>
>> -Isaac
>>
>> #!/usr/bin/python
>>
>> def add_at_index(new_item, target_array, target_index):
>>    """
>>    new_item is a single list item.
>>    target_array is a list or iterable.
>>    target_index is a number.
>>
>>    This function returns a new list that inserts new_item inside
>> target_array
>>    at target_array's target_index. The new list will be 1 element longer
>>    than before.
>>    """
>>
>>    new_list = target_array[:]
>>
>>    new_list.insert(target_index, new_item)
>>    return new_list
>>
>>
>> def append_lists(working_list, list_of_lists):
>>    # appends every list in list_of_lists to working_list; returns
>> working_list
>>    for _list in list_of_lists:
>>        working_list.append(_list)
>>    return working_list
>>
>>
>> def insert_each(orphan_item, target_array):
>>    """
>>    orphan_item is a single list item.
>>    target_array is a list or iterable.
>>
>>    This function returns a list of lists that place orphan_item in
>> between and at
>>    the ends of each list element in target_array
>>    """
>>
>>    new_array_length = len(target_array) + 1
>>    array_of_arrays = []
>>
>>    for count in range(new_array_length):
>>        array_of_arrays.append(add_at_index(orphan_item, target_array,
>> count))
>>
>>    return array_of_arrays
>>
>>
>>
>> def permute(original_list, list_of_lists):
>>    """
>>    accept a list of items, original_list, to insert one at a time
>> into list_of_lists
>>    using the function insert_each. Called for the first time,
>>    new_list is a list containing an empty list. Then call recursively
>> using
>>    an updated list_of_lists, called new_list_of_lists below, and the
>> remaining
>>    items in original list.
>>    """
>>    try:
>>        last_item = original_list.pop()
>>    except IndexError:
>>        # if the final iteration has been completed
>>        return list_of_lists
>>
>>    if list_of_lists == [[]]: # it is the first iteration
>>        # call the next iteration recursively
>>        return permute(original_list, [[last_item]])
>>    else:
>>        # placeholder for new permutations
>>        new_list_of_lists = []
>>        for array in list_of_lists:
>>            permutation_set = insert_each(last_item, array)
>>            append_lists(new_list_of_lists, permutation_set)
>>    # call recursively
>>    return permute(original_list, new_list_of_lists)
>


More information about the Tutor mailing list