Appending the same string to a list of strings in Python
I am trying to take one string, and append it to every string contained in a list, and then have a new list with the completed strings. Example:
开发者_运维问答list1 = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
*magic*
list2 = ['foobar', 'fobbar', 'fazbar', 'funkbar']
I tried for loops, and an attempt at list comprehension, but it was garbage. As always, any help, much appreciated.
The simplest way to do this is with a list comprehension:
[s + mystring for s in mylist]
Notice that I avoided using builtin names like list
because that shadows or hides the builtin names, which is very much not good.
Also, if you do not actually need a list, but just need an iterator, a generator expression can be more efficient (although it does not likely matter on short lists):
(s + mystring for s in mylist)
These are very powerful, flexible, and concise. Every good python programmer should learn to wield them.
my_list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
my_new_list = [x + string for x in my_list]
print my_new_list
This will print:
['foobar', 'fobbar', 'fazbar', 'funkbar']
map
seems like the right tool for the job to me.
my_list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
list2 = list(map(lambda orig_string: orig_string + string, my_list))
See this section on functional programming tools for more examples of map
.
Here is a simple answer using pandas
.
import pandas as pd
list1 = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
list2 = (pd.Series(list1) + string).tolist()
list2
# ['foobar', 'fobbar', 'fazbar', 'funkbar']
Updating with more options
Below are some of the methods I have followed, and I'm sure there could be more.
Method 1:
list1 = ['foo', 'fob', 'faz', 'funk']
list2 = [ls+"bar" for ls in list1] # using list comprehension
print(list2)
Method 2:
list1 = ['foo', 'fob', 'faz', 'funk']
list2 = list(map(lambda ls: ls+"bar", list1))
print(list2)
Method 3:
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
Method 4:
list1 = ['foo', 'fob', 'faz', 'funk']
addstring = 'bar'
list2 = []
for value in list1:
list2.append(str(value) + "bar")
print(list2)
Method 5:
list1 = ['foo', 'fob', 'faz', 'funk']
list2 = list(map(''.join, zip(list1, ["bar"]*len(list1))))
print(list2)
Avoid using keywords as variables like 'list', renamed 'list' as 'list1' instead
Running the following experiment the pythonic way:
[s + mystring for s in mylist]
seems to be ~35% faster than the obvious use of a for loop like this:
i = 0
for s in mylist:
mylist[i] = s+mystring
i = i + 1
Experiment
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)
Results
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
Combining map
and format
:
>>> list(map('{}bar'.format, ['foo', 'fob', 'faz', 'funk']))
['foobar', 'fobbar', 'fazbar', 'funkbar']
Thus, there is no loop variable.
It works for Python 2 and 3. (In Python 3 one can write [*map(...)]
, and in Python 2 just map(...)
.
If one prefers the modulo expression
>>> list(map('%sbar'.__mod__, ['foo', 'fob', 'faz', 'funk']))
['foobar', 'fobbar', 'fazbar', 'funkbar']
To prepend one can use __add__
method
>>> list(map('bar'.__add__, ['foo', 'fob', 'faz', 'funk']))
['barfoo', 'barfob', 'barfaz', 'barfunk']
Extending a bit to "Appending a list of strings to a list of strings":
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)
Result:
array(['a@1', 'b@2', 'c@3', 'd@4', 'e@5'], dtype=object)
dtype odject may be further converted str
new_list = [word_in_list + end_string for word_in_list in old_list]
Using names such as "list" for your variable names is bad since it will overwrite/override the builtins.
you can use lambda inside map in python. wrote a gray codes generator. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # your code goes here ''' the n-1 bit code, with 0 prepended to each word, followed by the n-1 bit code in reverse order, with 1 prepended to each word. '''
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))
list2 = ['%sbar' % (x,) for x in list]
And don't use list
as a name; it shadows the built-in type.
Just in case
list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
list[i] += string
print(list)
精彩评论