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.
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.
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']
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
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.
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
.
É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
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))
Au cas où
list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
list[i] += string
print(list)
list2 = ['%sbar' % (x,) for x in list]
Et n'utilisez pas list
comme nom; il ombrage le type intégré.
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.
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']