2010-01-12 118 views
86

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

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

*magic* 

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

我试过循环,并试图列表理解,但它是垃圾。与往常一样,任何帮助,非常感谢。

+14

这是不明智的,分配给'list'因为它是一个内置。 – 2010-01-12 16:54:06

回答

156

做到这一点,最简单的方法是用一个列表理解:我使用内建的名字一样可以避免因为list那阴影或隐藏内置的名字,这是非常不好的

[s + mystring for s in mylist] 

通知。

另外,如果你实际上并不需要的清单,而只是需要一个迭代器,生成器表达式可以更有效(尽管它确实对短名单不太可能事):

(s + mystring for s in mylist) 

这些都是很功能强大,灵活且简洁。每个优秀的Python程序员都应该学会如何使用它们。

+7

或者一个genexp,如果你想懒惰地使用'(s + mystring for s in mylist)' – 2010-01-12 16:54:43

+0

这绝对是个窍门,非常感谢,如果你知道一个很好的教程,我还是会围绕列表理解。在列表中的每个项目之前,有一个u',是否为unicode? – Kevin 2010-01-12 16:58:34

+0

@Kevin,是的,'u'''表示一个Unicode字符串。 – 2010-01-12 17:02:40

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

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

+0

为什么%sbar'%(x,)'而不是''%sbar' %x'?为什么不'x +'bar''? – 2010-01-12 17:27:14

+1

如果x碰巧是一个元组,第二个将失败。显然你*计划*让每个元素都是一个字符串,但有时候会出错。 第一个和第三个之间的区别主要是味道,除非您从外部来源获取字符串。 – 2010-01-12 17:29:29

+2

'raise exception'!='失败'。如果你有错误的数据类型,你已经失败了。我喜欢的表达引发了一个强调失败的例外;你首选的表情默默地产生垃圾。口感:巴洛克风格的慢速表达不符合我的口味。 – 2010-01-12 17:45:13

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

使用诸如“list”这样的名称作为你的变量名是坏的,因为它会覆盖/覆盖builtins。

14
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'] 
2

我还没有找到一种方法上的答案至今发表评论。所以在这里。 我支持Ignacio Vazquez-Abrams的回答list2 = ['%sbar' % x for x in list]

其他回答[string + "bar" for string in list]会适用于大多数时间,但如果您接受更简单的解决方案,您可以使用Python设计原则。应该有一个明显的方法来做到这一点。 %sbar一直工作。

+0

StackOverflow限制对其他帖子的评论,直到你在50分 – Ponkadoodle 2010-01-12 23:43:34

+1

@jeffjose:Ignacio的回答实际上是'list2 = ['%sbar'%(x,)for x in list]''。请给出一个例子,其中x表示一个字符串,'%sbar'%x'“工作”并且'x +'bar''没有。 – 2010-01-13 00:03:58

+1

原始问题指定了两个字符串。在这种情况下,s1 + s2'将始终工作(并且效率最高)。 – gahooa 2010-01-13 01:37:17

1

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

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

this section的函数式编程工具,用于map更多的例子。

0

你可以在Python中使用lambda里面的map。写了一个灰色代码生成器。 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

运行下面的实验中,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