Anexando a mesma string a uma lista de strings em Python


183

Estou tentando pegar uma seqüência e anexá-la a todas as seqüências contidas em uma lista e, em seguida, ter uma nova lista com as seqüências concluídas. Exemplo:

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

*magic*

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

Tentei fazer loops e uma tentativa de compreensão da lista, mas era lixo. Como sempre, qualquer ajuda, muito apreciada.


25
Não é aconselhável atribuir a, listpois é um builtin.
Noufal Ibrahim

Respostas:


315

A maneira mais simples de fazer isso é com uma compreensão de lista:

[s + mystring for s in mylist]

Observe que eu evitei usar nomes internos, listporque isso oculta ou oculta os nomes internos, o que não é muito bom.

Além disso, se você realmente não precisa de uma lista, mas apenas de um iterador, uma expressão de gerador pode ser mais eficiente (embora provavelmente não importe em listas curtas):

(s + mystring for s in mylist)

Estes são muito poderosos, flexíveis e concisos. Todo bom programador de python deve aprender a manejá-los.


8
Ou um genexp se quiser que ele preguiçosamente(s + mystring for s in mylist)
Noufal Ibrahim

Definitivamente isso funcionou, muito obrigado, ainda envolvendo minha compreensão da lista, se você conhece um bom tutorial. antes de cada item da lista, existe um u ', é para unicode?
Kevin

3
@ Kevin, aqui está um tutorial para strings unicode, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray

Se você precisa o índice da lista que você pode fazer["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus

1
Algo a ser observado: se você adicionar o "mystring" antes do "s", em vez de depois, ele concatenará o "mystring" no início de "s". como assim 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

Isso imprimirá:

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

5

map parece a ferramenta certa para o trabalho para mim.

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

Consulte esta seção sobre ferramentas de programação funcional para obter mais exemplos de map.


2

Executando o seguinte experimento da maneira pitônica:

[s + mystring for s in mylist]

parece ser ~ 35% mais rápido que o uso óbvio de um loop 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

Estendendo um pouco para "Anexando uma lista de cadeias a uma lista de cadeias":

    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 pode ser convertido ainda mais str


Update: Você pode evitar a cópia de mesmo símbolo várias vezes: at = np.full(fill_value='@',shape=1,dtype=object) ou simplesmente: at = np.array("@", dtype=object)
Artur Sokolovsky

1

você pode usar o lambda dentro do mapa em python. escreveu um gerador de códigos cinza. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # seu código vai aqui '' '' o código n-1 bit, com 0 precedido por cada palavra, seguido pelo código n-1 bit na ordem inversa, com 1 anexado a cada palavra. '' '

    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

Atualizando com mais opções

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 palavras-chave como variáveis ​​como 'list', renomeou 'list' como 'list1'


Essa é uma boa sugestão. Outra seria usar array_map com uma função que anexa a string ... php.net/manual/en/function.array-map.php
ROunofF

1

Aqui está uma resposta simples usando pandas.

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

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

altere o nome das variáveis ​​de list e string para outra coisa. lista é um tipo python
embutido

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

E não use listcomo nome; obscurece o tipo interno.


Por que ao '%sbar' % (x,)invés de '%sbar' % x? Por que não x + 'bar'?
John Machin

1
O segundo falhará se x for uma tupla. Obviamente, você planeja que cada elemento seja uma string, mas às vezes as coisas dão errado. A diferença entre o primeiro e o terceiro é principalmente o gosto, a menos que você obtenha a string de uma fonte externa.
Ignacio Vazquez-Abrams

2
'raise exception'! = 'fail'. Se você tiver o tipo de dados errado, você falhou. Minha expressão preferida gera uma exceção destacando a falha; sua expressão preferida produz silenciosamente lixo. Gosto: expressões lentas barrocas não são do meu gosto.
John Machin

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

Usar nomes como "lista" para os nomes de suas variáveis ​​é ruim, pois substituirá / substituirá os componentes internos.


0

Apenas no caso de

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.