web-dev-qa-db-fra.com

Ajouter la même chaîne à une liste de chaînes dans Python

J'essaie de prendre une chaîne et de l'ajouter à chaque chaîne contenue dans une liste, puis d'avoir une nouvelle liste avec les chaînes terminées. Exemple:

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

*magic*

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

J'ai essayé des boucles et une tentative de compréhension de la liste, mais c'était de la foutaise. Comme toujours, toute aide est très appréciée.

147
Kevin

La manière la plus simple de faire ceci est avec une compréhension de liste:

[s + mystring for s in mylist]

Notez que j’ai évité d’utiliser des noms intégrés tels que list parce que cela masque ou masque les noms intégrés, ce qui n’est vraiment pas satisfaisant.

De plus, si vous n'avez pas réellement besoin d'une liste, mais simplement d'un itérateur, une expression de générateur peut être plus efficace (même si cela n'a pas d'importance pour les listes courtes):

(s + mystring for s in mylist)

Ce sont très puissants, flexibles et concis. Tout bon programmeur python) devrait apprendre à les manier.

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

Cela va imprimer:

['foobar', 'fobbar', 'fazbar', 'funkbar']
21
Tendayi Mawushe

Exécutez l’expérience suivante à la manière Pythonic:

[s + mystring for s in mylist]

semble être environ 35% plus rapide que l'utilisation évidente d'une boucle for comme ceci:

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

Expérience

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)

Résultats

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
funk

Je n'ai pas trouvé de moyen de commenter les réponses jusqu'à maintenant. Alors le voici. Je soutiens la réponse de Ignacio Vazquez-Abrams du list2 = ['%sbar' % x for x in list].

Autres réponses avec [string + "bar" for string in list] _ fonctionnerait la plupart du temps, mais si vous acceptez une solution plus générale pour le cas le plus simple, vous êtes - à mon humble avis - à la suite de Python Principes de conception. Il devrait y avoir de préférence un moyen évident de le faire. il. %sbar fonctionne tout le temps.

2
Jeffrey Jose

map me semble être le bon outil pour ce travail.

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

Voir cette section sur les outils de programmation fonctionnels pour plus d'exemples de map.

2
DMan

Étendre un peu à "Ajouter une liste de chaînes à une liste de chaînes":

    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)

Résultat:

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

dtype odject peut être converti davantage str

2
Artur Sokolovsky

vous pouvez utiliser lambda dans la carte en python. a écrit un générateur de codes gris. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # votre code va ici '' 'le code n-1 bit, avec 0 préfixé à chaque mot, suivi du code de n-1 bit dans l'ordre inverse, avec 1 ajouté à chaque mot. '' '

    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
Rohit Malgaonkar

Au cas où

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
0
tanweer alam
list2 = ['%sbar' % (x,) for x in list]

Et n'utilisez pas list comme nom; il ombrage le type intégré.

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

Utiliser des noms tels que "liste" pour vos noms de variables est mauvais car cela écrasera/remplacera les commandes intégrées.

0
Nope

Voici une réponse simple en utilisant pandas.

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

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