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


182

我正在尝试采用一个字符串,并将其附加到列表中包含的每个字符串中,然后使用完成的字符串创建一个新列表。例:

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

*magic*

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

我尝试了循环,并尝试了列表理解,但这是垃圾。一如既往的任何帮助,不胜感激。


25
分配给它是不明智的,list因为它是内置的。
Noufal Ibrahim 2010年

Answers:


313

最简单的方法是使用列表理解:

[s + mystring for s in mylist]

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

另外,如果您实际上不需要列表,而只需要一个迭代器,则生成器表达式可以更有效(尽管在短列表中这并不重要):

(s + mystring for s in mylist)

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


8
或genexp,如果您懒惰的话(s + mystring for s in mylist)
Noufal Ibrahim 2010年

非常感谢,如果您知道一个很好的教程,那肯定可以解决问题,仍然感谢我。列表中每个项目之前都有一个u',是unicode吗?
凯文2010年

3
@Kevin,这是unicode字符串的教程,docs.python.org
tutorial / introduction.html#

如果您需要列表中的索引,可以执行["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus,

1
注意事项:如果在“ s”之前而不是之后添加“ mystring”,它将在“ s”的开头连接“ mystring”。像这样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

这将打印:

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

5

map 对我来说,这似乎是工作的正确工具。

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

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


2

以pythonic方式运行以下实验:

[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

2

扩展到“将字符串列表追加到字符串列表”:

    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


更新:您可以避免多次复制同一符号: at = np.full(fill_value='@',shape=1,dtype=object) 或简单地: at = np.array("@", dtype=object)
Artur Sokolovsky

1

您可以在python地图中使用lambda。写了一个格雷码生成器。 https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py# 您的代码在此处'''n-1位代码,每个单词前加0,后跟以相反的顺序排列的n-1位代码,每个单词前加1。'''

    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

更新更多选项

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

避免将关键字用作“列表”之类的变量,而应将“列表”重命名为“ list1”


这是一个很好的建议。另一个方法是将array_map与附加字符串的函数一起使用... php.net/manual/en/function.array-map.php
ROunofF

1

这是使用的简单答案pandas

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

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

请将变量名称从列表和字符串更改为其他名称。list是一个内置的python类型
sagi

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

并且不要使用list名字;它隐藏了内置类型。


为什么要'%sbar' % (x,)代替'%sbar' % x?为什么不x + 'bar'呢?
约翰·马钦

1
如果x恰好是一个元组,则第二个将失败。显然,您计划让每个元素都是一个字符串,但有时会出错。第一个和第三个之间的区别主要是味道,除非您从外部来源获得琴弦。
伊格纳西奥·巴斯克斯

2
'raise exception'!='失败'。如果数据类型错误,则说明您已经失败了。我的首选表达方式引发了一个异常,突出了失败;您首选的表达式会无声产生垃圾。味道:巴洛克式的表情迟钝不符合我的口味。
约翰·马钦

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

为变量名使用“ list”之类的名称是不好的,因为它将覆盖/覆盖内置函数。


0

以防万一

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.