我正在嘗試使用一個字符串,並將其附加到列表中包含的每個字符串,然後使用完整的字符串創建一個新列表。例如:將相同的字符串追加到Python中的字符串列表中
list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
*magic*
list2 = ['foobar', 'fobbar', 'fazbar', 'funkbar']
我試過循環,並試圖列表理解,但它是垃圾。與往常一樣,任何幫助,非常感謝。
我正在嘗試使用一個字符串,並將其附加到列表中包含的每個字符串,然後使用完整的字符串創建一個新列表。例如:將相同的字符串追加到Python中的字符串列表中
list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
*magic*
list2 = ['foobar', 'fobbar', 'fazbar', 'funkbar']
我試過循環,並試圖列表理解,但它是垃圾。與往常一樣,任何幫助,非常感謝。
做到這一點,最簡單的方法是用一個列表理解:我使用內建的名字一樣可以避免因爲list
那陰影或隱藏內置的名字,這是非常不好的
[s + mystring for s in mylist]
通知。
另外,如果你實際上並不需要的清單,而只是需要一個迭代器,生成器表達式可以更有效(儘管它確實對短名單不太可能事):
(s + mystring for s in mylist)
這些都是很功能強大,靈活且簡潔。每個優秀的Python程序員都應該學會如何使用它們。
或者一個genexp,如果你想懶惰地使用'(s + mystring for s in mylist)' – 2010-01-12 16:54:43
這絕對是個竅門,非常感謝,如果你知道一個很好的教程,我還是會圍繞列表理解。在列表中的每個項目之前,有一個u',是否爲unicode? – Kevin 2010-01-12 16:58:34
@Kevin,是的,'u'''表示一個Unicode字符串。 – 2010-01-12 17:02:40
list2 = ['%sbar' % (x,) for x in list]
並且不要使用list
作爲名稱;它會隱藏內置類型。
爲什麼%sbar'%(x,)'而不是''%sbar' %x'?爲什麼不'x +'bar''? – 2010-01-12 17:27:14
如果x碰巧是一個元組,第二個將失敗。顯然你*計劃*讓每個元素都是一個字符串,但有時候會出錯。 第一個和第三個之間的區別主要是味道,除非您從外部來源獲取字符串。 – 2010-01-12 17:29:29
'raise exception'!='失敗'。如果你有錯誤的數據類型,你已經失敗了。我喜歡的表達引發了一個強調失敗的例外;你首選的表情默默地產生垃圾。口感:巴洛克風格的慢速表達不符合我的口味。 – 2010-01-12 17:45:13
new_list = [word_in_list + end_string for word_in_list in old_list]
使用諸如「list」這樣的名稱作爲你的變量名是壞的,因爲它會覆蓋/覆蓋builtins。
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']
我還沒有找到一種方法上的答案至今發表評論。所以在這裏。 我支持Ignacio Vazquez-Abrams的回答list2 = ['%sbar' % x for x in list]
。
其他回答[string + "bar" for string in list]
會適用於大多數時間,但如果您接受更簡單的解決方案,您可以使用Python設計原則。應該有一個明顯的方法來做到這一點。 %sbar
一直工作。
StackOverflow限制對其他帖子的評論,直到你在50分 – Ponkadoodle 2010-01-12 23:43:34
@jeffjose:Ignacio的回答實際上是'list2 = ['%sbar'%(x,)for x in list]''。請給出一個例子,其中x表示一個字符串,'%sbar'%x'「工作」並且'x +'bar''沒有。 – 2010-01-13 00:03:58
原始問題指定了兩個字符串。在這種情況下,s1 + s2'將始終工作(並且效率最高)。 – gahooa 2010-01-13 01:37:17
map
似乎是對我來說這項工作的正確工具。
my_list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
list2 = map(lambda orig_string: orig_string + string, my_list)
見this section的函數式編程工具,用於map
更多的例子。
你可以在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))
運行下面的實驗中,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
這是不明智的,分配給'list'因爲它是一個內置。 – 2010-01-12 16:54:06