Aggiunta della stessa stringa a un elenco di stringhe in Python


183

Sto provando a prendere una stringa e ad aggiungerla a ogni stringa contenuta in un elenco, quindi ho un nuovo elenco con le stringhe completate. Esempio:

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

*magic*

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

Ho provato per i loop e un tentativo di comprensione dell'elenco, ma era spazzatura. Come sempre, qualsiasi aiuto, molto apprezzato.


25
Non è saggio assegnarlo listpoiché è incorporato.
Noufal Ibrahim,

Risposte:


315

Il modo più semplice per farlo è con una comprensione dell'elenco:

[s + mystring for s in mylist]

Si noti che ho evitato di usare nomi incorporati come listperché ombre o nascondono i nomi incorporati, il che non è molto buono.

Inoltre, se in realtà non hai bisogno di un elenco, ma hai solo bisogno di un iteratore, un'espressione del generatore può essere più efficiente (anche se probabilmente non ha importanza negli elenchi brevi):

(s + mystring for s in mylist)

Questi sono molto potenti, flessibili e concisi. Ogni buon programmatore di Python dovrebbe imparare a maneggiarli.


8
O un genexp se lo vuoi pigramente(s + mystring for s in mylist)
Noufal Ibrahim,

Questo sicuramente ha risolto il problema, grazie mille, ancora avvolgendo la mia testa intorno alla comprensione dell'elenco, se conosci un buon tutorial su di esso. prima di ogni elemento nell'elenco, c'è un u ', è per Unicode?
Kevin,

3
@Kevin, ecco un tutorial per stringhe unicode, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray,

Se hai bisogno dell'indice dalla lista, puoi farlo["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus,

1
Qualcosa da notare: se aggiungi il "mystring" prima della "s", piuttosto che dopo, concatenerà il "mystring" all'inizio di "s". in questo modo 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

Questo stamperà:

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

5

map mi sembra lo strumento giusto per il lavoro.

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

Vedi questa sezione sugli strumenti di programmazione funzionale per ulteriori esempi di map.


2

Eseguendo il seguente esperimento in modo pitonico:

[s + mystring for s in mylist]

sembra essere ~ 35% più veloce dell'ovvio uso di un ciclo for in questo modo:

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

Sperimentare

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)

risultati

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 un po 'a "Aggiunta di un elenco di stringhe a un elenco di stringhe":

    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)

Risultato:

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

odject dtype può essere ulteriormente convertito str


Aggiornamento: puoi evitare di copiare più volte lo stesso simbolo: at = np.full(fill_value='@',shape=1,dtype=object) o semplicemente: at = np.array("@", dtype=object)
Artur Sokolovsky

1

puoi usare lambda all'interno della mappa in Python. ha scritto un generatore di codici grigi. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # il tuo codice va qui '' 'il codice n-1 bit, con 0 anteposto a ogni parola, seguito dal n-1 codice bit in ordine inverso, con 1 anteposto a ogni parola. '''

    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

Aggiornamento con più opzioni

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

Evita di usare parole chiave come variabili come 'list', rinominato 'list' come 'list1'


Questo è un buon suggerimento Un altro sarebbe quello di utilizzare array_map con una funzione che aggiunge la stringa ... php.net/manual/en/function.array-map.php
ROunofF

1

Ecco una semplice risposta usando pandas.

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

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

cambia il nome delle variabili dall'elenco e dalla stringa in qualcos'altro. list è un tipo di pitone incorporato
sagi

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

E non usare listcome nome; ombreggia il tipo incorporato.


Perché '%sbar' % (x,)invece di '%sbar' % x? Perché no x + 'bar'?
John Machin,

1
Il secondo fallirà se x sembra essere una tupla. Ovviamente hai intenzione di avere ogni elemento come una stringa, ma a volte le cose vanno male. La differenza tra il primo e il terzo è per lo più gusto, a meno che non si ottenga la stringa da una fonte esterna.
Ignacio Vazquez-Abrams,

2
'raise exception'! = 'fail'. Se hai il tipo di dati sbagliato, hai già fallito. La mia espressione preferita solleva un'eccezione evidenziando l'errore; la tua espressione preferita produce silenziosamente immondizia. Gusto: le espressioni lente barocche non sono di mio gusto.
John Machin,

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

L'uso di nomi come "list" per i nomi delle variabili è negativo poiché sovrascriverà / sovrascriverà i builtin.


0

Nel caso in cui

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.