Agregar la misma cadena a una lista de cadenas en Python


183

Estoy tratando de tomar una cadena, y agregarla a cada cadena contenida en una lista, y luego tener una nueva lista con las cadenas completadas. Ejemplo:

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 fue basura. Como siempre, cualquier ayuda, muy apreciada.


25
No es prudente asignarlo listya que es un incorporado.
Noufal Ibrahim

Respuestas:


315

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

[s + mystring for s in mylist]

Tenga en cuenta que evité usar nombres incorporados como listporque eso oculta u oculta los nombres incorporados, lo que no es bueno.

Además, si realmente no necesita una lista, pero solo necesita un iterador, una expresión generadora puede ser más eficiente (aunque probablemente no importe en listas cortas):

(s + mystring for s in mylist)

Estos son muy poderosos, flexibles y concisos. Todo buen programador de Python debería aprender a manejarlos.


8
O un genexp si lo quieres perezosamente(s + mystring for s in mylist)
Noufal Ibrahim

Eso definitivamente funcionó, muchas gracias, todavía entorpeciendo la comprensión de la lista, si conoces un buen tutorial al respecto. antes de cada elemento de la lista, hay una u ', ¿es eso para Unicode?
Kevin

3
@ Kevin, aquí hay un tutorial para cadenas Unicode, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray

Si necesita el índice de la lista, puede hacerlo["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus el

1
Algo a tener en cuenta: si agrega "mystring" antes de "s", en lugar de después, concatenará "mystring" al comienzo de "s". like so list2 = ["mystring" + s for s in mylist]=list2 = ['barfoo', 'barfob', 'barfaz', 'barfunk']
Paul Tuckett

25
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']

5

map me parece la herramienta adecuada para el trabajo.

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

Consulte esta sección sobre herramientas de programación funcional para obtener más ejemplos de map.


2

Ejecutando el siguiente experimento de la manera pitónica:

[s + mystring for s in mylist]

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

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

Experimentar

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

2

Extendiendo un poco a "Agregar una lista de cadenas a una lista de cadenas":

    import numpy as np
    lst1 = ['a','b','c','d','e']
    lst2 = ['1','2','3','4','5']

    at = np.full(fill_value='@',shape=len(lst1),dtype=object) #optional third list
    result = np.array(lst1,dtype=object)+at+np.array(lst2,dtype=object)

Resultado:

array(['a@1', 'b@2', 'c@3', 'd@4', 'e@5'], dtype=object)

dtype odject puede convertirse aún más str


Actualización: puede evitar copiar el mismo símbolo varias veces: at = np.full(fill_value='@',shape=1,dtype=object) o simplemente: at = np.array("@", dtype=object)
Artur Sokolovsky

1

puedes 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 bit n-1, con 0 antepuesto a cada palabra, seguido por el código de n-1 bit en orden inverso, con 1 antepuesto a 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

Actualizando con más opciones

list1 = ['foo', 'fob', 'faz', 'funk']
addstring = 'bar'
for index, value in enumerate(list1):
    list1[index] = addstring + value #this will prepend the string
    #list1[index] = value + addstring this will append the string

Evite usar palabras clave como variables como 'lista', en su lugar cambie el nombre de 'lista' como 'lista1'


Esta es una buena sugerencia. Otro sería usar array_map con una función que anexe la cadena ... php.net/manual/en/function.array-map.php
ROunofF

1

Aquí hay una respuesta simple usando pandas.

import pandas as pd
list1 = ['foo', 'fob', 'faz', 'funk']
string = 'bar'

list2 = (pd.Series(list1) + string).tolist()
list2
# ['foobar', 'fobbar', 'fazbar', 'funkbar']

cambie el nombre de las variables de la lista y la cadena a otra cosa. la lista es de tipo pitón incorporado
sagi

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

Y no lo uses listcomo nombre; sombrea el tipo incorporado.


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

1
El segundo fallará si x resulta ser una tupla. Obviamente, planea que cada elemento sea una cadena, pero a veces las cosas salen mal. La diferencia entre el primero y el tercero es principalmente el sabor, a menos que obtenga la cadena de una fuente externa.
Ignacio Vazquez-Abrams

2
'raise exception'! = 'fall'. Si usted tiene el tipo de datos incorrecto, que ha ya ha fallado. Mi expresión preferida plantea una excepción que destaca el fracaso; tu expresión preferida en silencio produce basura. Gusto: las expresiones lentas barrocas no son de mi agrado.
John Machin

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

El uso de nombres como "lista" para sus nombres de variables es malo, ya que sobrescribirá / anulará los valores incorporados.


0

Por si acaso

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.