2012-02-01 19 views
0

我需要將list_中的所有元素附加到string;最後我需要添加一個後綴。點'。'必須分開所有元素:加入不添加空白處的分隔符

list_ = args[f(n) : f(n+1)] 
if list_: 
    string += '.' + '.'.join(list_) + '.' + suffix # works except when list_ is empty 
else: 
    string += '.' + suffix 
# list_ isn't used after this 

我可以在一行中以更簡單的方式重寫它嗎?如果join每個元素後添加一個分隔符,它只是這個:

string += '.' + '.'.join(args[f(n) : f(n+1)]) + '.' + suffix 

編輯

我剛剛得知:

切片是副本,即使他們從來沒有分配到:Does Python do slice-by-reference on strings?

但islice可能會更糟糕,因爲它遍歷列表的開始:itertools.islice compared to list slice

個的一些替代品在這裏討論:Avoiding unnecessary slice copying in Python

回答

3

我會走這(更新以反映編輯的問題):

'.'.join([''] + args[f(n):f(n+1)] + [suffix]) 

編輯:採取從sblom的靈感和unutbu的答案,我可能實際上做到這一點:

from itertools import chain, islice 
string = '.'.join(chain([string], islice(args, f(n), f(n+1)), [suffix])) 

如果我是concerne d關於切片args的內存成本。您可以使用元組(string,)或列表[string]作爲字符串和後綴;考慮到它們各自是一個元素,內存使用或執行時間沒有顯着差異,並且由於它們沒有被存儲,所以您不必擔心可變性。我發現列表語法有點乾淨。

但是:我不確定Python是否實際上創建了一個新的列表對象,這個列表對象只會被使用,而不會被分配給。如果沒有,那麼args是一個正確的列表,使用islice而不是[f(n):f(n+1)]並不能節省你很多東西,在這種情況下,我只需要使用簡單的方法(最高)。如果args是一個生成器或其他非常大量元素的可評估迭代器,那麼然後islice可能是值得的。

+0

在我的特定情況下,這看起來很完美。 – max 2012-02-01 22:23:05

+0

切片確實創建了一個副本,但仍然比'islice'更便宜。 – max 2012-02-06 03:16:59

1
string += ('.' + '.'.join(list_) if list_ else '') + '.' + suffix 
+0

對不起,忘了提及'list_'實際上是一個表達式;我希望避免爲它創建一個額外的變量(請參閱我的問題的更新)。 – max 2012-02-01 22:14:15

+0

那麼,你已經在你的代碼上做了這個...然後去David的代碼,如果你不重要創建2個額外的列表。 – JBernardo 2012-02-01 22:16:09

+0

是的,就我而言,這不是性能問題,只是讓代碼看起來很簡單。 – max 2012-02-01 22:20:41

3

如果list_是發電機(或可平凡改爲一個),你可以逃脫,而完全不使用chain()itertools物化任何名單。

from itertools import chain 
'.'.join(chain(('',),list_,(suffix,))) 

(這需要從大衛Zaslavsky的答案靈感。)

+0

我喜歡這種方法 - 但我不確定創建一個返回現有列表切片的生成器是否容易? – max 2012-02-01 22:22:42

+0

當然,你可以使用'itertools.islice(list_,f(n),f(n + 1))'。 – 2012-02-01 22:39:36

+0

@DavidZaslavsky:根據我所學到的內容(請參閱問題的更新),'islice'在列表中表現糟糕......如果我有一個真正的生成器,我會使用這種方法。 – max 2012-02-06 03:15:21