2010-01-12 8 views
86

Estoy tratando de tomar una cadena, y anexarla a cada cadena contenida en una lista, y luego tener una nueva lista con las cadenas completadas. Ejemplo:Agregar la misma cadena a una lista de cadenas en Python

list = ['foo', 'fob', 'faz', 'funk'] 
string = 'bar' 

*magic* 

list2 = ['foobar', 'fobbar', 'fazbar', 'funkbar'] 

Traté de bucles, y un intento de comprensión de la lista, pero era basura. Como siempre, cualquier ayuda, muy apreciada.

+14

Es aconsejable asignar a 'list' ya que es una orden interna. –

Respuesta

156

La forma más sencilla de hacerlo es con una lista por comprensión:

[s + mystring for s in mylist] 

en cuenta que evitaba el uso de nombres incorporados como list debido a que las sombras u oculta los nombres incorporados, que no es mucho bueno.

Además, si en realidad no necesita una lista, pero sólo tiene un iterador, una expresión generador puede ser más eficiente (aunque sí que importa no es probable en las listas cortas):

(s + mystring for s in mylist) 

Estos son muy poderoso, flexible y conciso. Todo buen programador de pitones debería aprender a manejarlos.

+7

O un genexp si lo quiere perezosamente '(s + mystring para s en mylist)' –

+0

Definitivamente funcionó el truco, muchas gracias, todavía me envolvía la comprensión de la lista, si conoce un buen tutorial sobre eso. antes de cada elemento en la lista, hay un u ', ¿eso es para unicode? – Kevin

+0

@Kevin, sí, 'u''' indica una cadena Unicode. –

0
list2 = ['%sbar' % (x,) for x in list] 

Y no utilice list como nombre; sombrea el tipo incorporado.

+0

Por qué ''% sbar'% (x,)' en lugar de ''% sbar' % x'? ¿Por qué no 'x + 'bar''? –

+1

El segundo error si x pasa a ser una tupla. Obviamente, usted * planifica * que cada elemento sea una cadena, pero a veces las cosas salen mal. La diferencia entre el primero y el tercero es principalmente de gusto, a menos que obtenga el hilo de una fuente externa. –

+2

'raise exception'! = 'Fail'. Si tiene el tipo de datos incorrecto, * ya * falló. Mi expresión preferida plantea una excepción que resalta la falla; su expresión preferida produce silenciosamente basura. Sabor: las expresiones barrocas lentas no son de mi gusto. –

0
new_list = [word_in_list + end_string for word_in_list in old_list] 

El uso de nombres tales como "lista" para sus nombres de las variables es malo, ya que se sobreponen a/anular las órdenes internas.

14
my_list = ['foo', 'fob', 'faz', 'funk'] 
string = 'bar' 
my_new_list = [x + string for x in my_list] 
print my_new_list 

Esto imprimirá:

['foobar', 'fobbar', 'fazbar', 'funkbar'] 
2

no he encontrado una manera de hacer comentarios sobre las respuestas hasta ahora. Asi que aqui esta. Apoyo la respuesta de Ignacio Vazquez-Abrams de list2 = ['%sbar' % x for x in list].

Otras respuestas con [string + "bar" for string in list] funcionarían la mayoría de las veces, pero si acepta una solución más general para el caso más simple, está, en mi humilde opinión, siguiendo los Principios de diseño de Python. Debería haber preferiblemente una forma obvia de hacerlo. %sbar funciona todo el tiempo.

+0

StackOverflow restringe el comentario en otras publicaciones hasta que esté en 50 puntos – Ponkadoodle

+1

@jeffjose: la respuesta de Ignacio fue de hecho 'list2 = ['% sbar'% (x,) para x en la lista]'. Por favor, den ejemplos donde x se refiere a una cadena y ''% sbar'% x'" funciona "y' x + 'bar'' no. –

+1

La pregunta original especificaba dos cadenas. 's1 + s2' siempre funcionará (y más eficientemente) en ese caso. – gahooa

1

map me parece la herramienta adecuada para el trabajo.

my_list = ['foo', 'fob', 'faz', 'funk'] 
string = 'bar' 
list2 = map(lambda orig_string: orig_string + string, my_list) 

Ver this section en las herramientas de programación funcional para más ejemplos de map.

0

puede usar lambda dentro del mapa en python. escribió un generador de códigos grises. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # su código va aquí ''' el código de n bits 1, donde 0 colocado al comienzo de cada palabra, seguido por el código bit n-1 en orden inverso, con 1 colocado al comienzo de cada palabra. '''

def graycode(n): 
     if n==1: 
      return ['0','1'] 
     else: 
      nbit=map(lambda x:'0'+x,graycode(n-1))+map(lambda x:'1'+x,graycode(n-1)[::-1]) 
      return nbit 

    for i in xrange(1,7): 
     print map(int,graycode(i)) 
1

ejecutando el siguiente experimento de la forma Pythonic:

[s + mystring for s in mylist] 

parece ser ~ 35% más rápido que el uso evidente de un bucle como este:

i = 0 
for s in mylist: 
    mylist[i] = s+mystring 
    i = i + 1 

Experimento

import random 
import string 
import time 

mystring = '/test/' 

l = [] 
ref_list = [] 

for i in xrange(10**6): 
    ref_list.append(''.join(random.choice(string.ascii_lowercase) for i in range(10))) 

for numOfElements in [5, 10, 15 ]: 

    l = ref_list*numOfElements 
    print 'Number of elements:', len(l) 

    l1 = list(l) 
    l2 = list(l) 

    # Method A 
    start_time = time.time() 
    l2 = [s + mystring for s in l2] 
    stop_time = time.time() 
    dt1 = stop_time - start_time 
    del l2 
    #~ print "Method A: %s seconds" % (dt1) 

    # Method B 
    start_time = time.time() 
    i = 0 
    for s in l1: 
     l1[i] = s+mystring 
     i = i + 1 
    stop_time = time.time() 
    dt0 = stop_time - start_time 
    del l1 
    del l 
    #~ print "Method B: %s seconds" % (dt0) 

    print 'Method A is %.1f%% faster than Method B' % ((1 - dt1/dt0)*100) 

Resultados

Number of elements: 5000000 
Method A is 38.4% faster than Method B 
Number of elements: 10000000 
Method A is 33.8% faster than Method B 
Number of elements: 15000000 
Method A is 35.5% faster than Method B 
Cuestiones relacionadas