2010-02-07 18 views
29

Estoy tratando de imprimir todos los resultados posibles de una lista determinada y me preguntaba cómo poner un valor en varias ubicaciones de la lista. Por ejemplo, si mi lista era [A,B], quiero insertar X en todos los índices posibles de la lista de manera que devuelva este [X,A,B], [A,X,B], [A,B,X].Insertar valores en ubicaciones específicas en una lista en Python

Estaba pensando en usar range(len()) y un bucle pero no estoy seguro de cómo comenzar.

+0

"todos los posibles resultados de una lista dada" de longitud 3 le daría 6 permutaciones. – bernie

+0

Lo sé, simplemente no las escribí todas – Dan

Respuesta

19

Usted puede hacer esto con la siguiente lista de comprensión:

[mylist[i:] + [newelement] + mylist[:i] for i in xrange(len(mylist),-1,-1)] 

Con su ejemplo:

>>> mylist=['A','B'] 
>>> newelement='X' 
>>> [mylist[i:] + [newelement] + mylist[:i] for i in xrange(len(mylist),-1,-1)] 
[['X', 'A', 'B'], ['B', 'X', 'A'], ['A', 'B', 'X']] 
+0

¿hay alguna diferencia entre xrange y range?y es posible hacer: para i en xrange (len (mylist), - 1, -1): mylist [i:] + [newelement] + mylist [: i] porque esto es para tareas y yo nunca aprendió la forma en que lo escribió – Dan

+2

el rango genera todos los números en la secuencia de una vez y devuelve estos números en una lista. xrange genera cada número en el rango * como lo necesite *. Por lo tanto, xrange usa menos memoria (mucho menos si la secuencia es bastante grande). Entonces, a menos que realmente necesite todos los números a la vez, xrange puede ser más eficiente. El código que sugieres también podría ser el truco. (Aunque es posible que desee hacer algo con las listas que construye en el cuerpo del bucle for). –

-1

Si l es su lista y X es su valor:

for i in range(len(l) + 1): 
    print l[:i] + [X] + l[i:] 
+0

la llamada de eliminación puede eliminar otra instancia de X –

+0

¡Buena llamada, gracias! Arreglando ahora. –

67

Use insert() para insertar un elemento antes de una posición dada.

Por ejemplo, con

arr = ['A','B','C'] 
arr.insert(0,'D') 

arr convierte [ 'D', 'A', 'B', 'C'] porque 'D' se inserta antes del elemento en el índice 0.

Ahora, por

arr = ['A','B','C'] 
arr.insert(4,'D') 

arr convierte [ 'a', 'B', 'C', 'D'] porque 'D' se inserta antes del elemento en el índice 4 (que es 1 más allá del extremo de la matriz).

Sin embargo, si está buscando generar todas las permutaciones de una matriz, hay formas de hacerlo ya integradas en Python. El paquete itertools tiene un generador de permutación.

Aquí hay un código de ejemplo:

import itertools 
arr = ['A','B','C'] 
perms = itertools.permutations(arr) 
for perm in perms: 
    print perm 

imprimirá

('A', 'B', 'C') 
('A', 'C', 'B') 
('B', 'A', 'C') 
('B', 'C', 'A') 
('C', 'A', 'B') 
('C', 'B', 'A') 
3

Si desea insertar una lista en una lista, puede hacer esto:

>>> a = [1,2,3,4,5] 
>>> for x in reversed(['a','b','c']): a.insert(2,x) 
>>> a 
[1, 2, 'a', 'b', 'c', 3, 4, 5] 
0

Coming desde JavaScript, esto era algo que estaba acostumbrado a tener "incorporado" a través de Array.prototype.splice(), así que hice una función de Python que t hace lo mismo:

def list_splice(target, start, delete_count=None, *items): 
    """Remove existing elements and/or add new elements to a list. 

    target  the target list (will be changed) 
    start   index of starting position 
    delete_count number of items to remove (default: len(target) - start) 
    *items  items to insert at start index 

    Returns a new list of removed items (or an empty list) 
    """ 
    if delete_count == None: 
     delete_count = len(target) - start 

    # store removed range in a separate list and replace with *items 
    total = start + delete_count 
    removed = target[start:total] 
    target[start:total] = items 

    return removed 
-1

más simple es la lista de uso [i: i]

a = [1,2, 3, 4] 
    a[2:2] = [10] 

de impresión A Para comprobar inserción

print a 
    [1, 2, 10, 3, 4] 
+1

No responde la pregunta, solo da un enfoque sobre cómo insertar en una posición determinada en una lista. La pregunta solicitó el resultado en la forma de todas las listas resultantes al insertar un valor en todas las posiciones posibles. – Olivier

Cuestiones relacionadas