[Tutor] feedback on permutations script

Shashwat Anand anand.shashwat at gmail.com
Sun Jul 11 00:37:32 CEST 2010


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)
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20100711/cfc9ad05/attachment.html>


More information about the Tutor mailing list