2010-01-12 147 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 
相關問題