在Python中将相同的字符串添加到字符串列表中

我试图采取一个字符串,并将其附加到每个字符串包含在一个列表,然后有一个新的列表与完成的字符串。例子:

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


*magic*


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

我尝试了for循环,并尝试了列表理解,但它是垃圾。一如既往,任何帮助,非常感谢。

321685 次浏览

最简单的方法是使用列表推导式:

[s + mystring for s in mylist]

注意,我避免使用像list这样的内置名称,因为这会掩盖或隐藏内置名称,这非常不好。

此外,如果你实际上不需要一个列表,而只是需要一个迭代器,生成器表达式可能会更有效(尽管这对短列表来说可能无关紧要):

(s + mystring for s in mylist)

这些功能非常强大、灵活且简洁。每个优秀的python程序员都应该学会使用它们。

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

不要使用list作为名称;它隐藏内置类型。

new_list = [word_in_list + end_string for word_in_list in old_list]

使用诸如“list”这样的名称作为变量名是不好的,因为它将覆盖/覆盖内置。

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

这将打印:

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

对我来说,map似乎是适合这项工作的工具。

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

有关map的更多示例,请参阅函数式编程工具上的本节

你可以在python中使用lambda inside map。写了一个灰色代码生成器。 https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py #你的代码在这里 “‘ n-1位代码,每个单词前加0,后面加 反向排列的n-1位代码,每个单词前加1。 " < / p >

    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))

以python的方式运行下面的实验:

[s + mystring for s in mylist]

似乎比明显使用for循环快35%:

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

实验

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)

结果

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

扩展位到“追加一个字符串列表到一个字符串列表”:

    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)

结果:

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

Dtype odject可以进一步转换为STR

下面是一个使用pandas的简单答案。

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


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

以防万一

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
list[i] += string
print(list)

使用更多选项进行更新

以下是我所遵循的一些方法,我相信还会有更多。

< >强方法1:< / >强

list1 = ['foo', 'fob', 'faz', 'funk']
list2 = [ls+"bar" for ls in list1] # using list comprehension
print(list2)

< >强方法2:< / >强

list1 = ['foo', 'fob', 'faz', 'funk']
list2 = list(map(lambda ls: ls+"bar", list1))
print(list2)

< >强方法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

< >强方法4:< / >强

list1 = ['foo', 'fob', 'faz', 'funk']
addstring = 'bar'
list2 = []
for value in list1:
list2.append(str(value) + "bar")
print(list2)

< >强方法5:< / >强

list1 = ['foo', 'fob', 'faz', 'funk']
list2 = list(map(''.join, zip(list1, ["bar"]*len(list1))))
print(list2)

避免使用关键字作为变量,如“list”,将“list”重命名为“list1”

结合mapformat:

>>> list(map('{}bar'.format,  ['foo', 'fob', 'faz', 'funk']))
['foobar', 'fobbar', 'fazbar', 'funkbar']

因此没有循环变量 它适用于Python 2和Python 3。(在Python 3中可以写[*map(...)],而在Python 2中只能写map(...).

如果有人喜欢模表达式

>>> list(map('%sbar'.__mod__,  ['foo', 'fob', 'faz', 'funk']))
['foobar', 'fobbar', 'fazbar', 'funkbar']

对于预谋,可以使用__add__方法

>>> list(map('bar'.__add__,  ['foo', 'fob', 'faz', 'funk']))
['barfoo', 'barfob', 'barfaz', 'barfunk']