2012-08-29 52 views
17

現在我一直在試圖字符串列表執行帶(),我這樣做:有沒有更好的方法來使用字符串列表上的strip()? - 蟒蛇

i = 0 
for j in alist: 
    alist[i] = j.strip() 
    i+=1 

是否有這樣做的更好的辦法?

+7

Upvoting for random anonymous uncommented downvote。如果問題出現問題,在沒有告訴作者什麼的情況下,完全沒有意義。 – KRyan

+0

@DragoonWraith聽到,聽到。 – chucksmash

+3

如果你想迭代使用索引,在枚舉(alist)' – Kos

回答

26

你可能不應該使用list作爲變量名,因爲它是一個類型。不管:

list = map(str.strip, list) 

這將適用於功能str.strip的每個元素在list,返回一個新的列表,並將結果存回list

+1

+1就是這樣。如果你想改變相同的列表實例,而不是將變量綁定到一個新的列表(比如說,不要打斷其他對這個列表的引用),可以使用像@kojiro這樣的片語法 – Kos

+2

「map」是一個很好的例子選擇。 (當然,例如分配給片時,'itertools.imap'可能會也可能不會更好。 – Marcin

+0

@Kos在這種情況下,基於迭代器的解決方案會更好(因爲它避免了創建整個列表,然後未引用並等待垃圾回收)。 – Marcin

3

我想你的意思

a_list = [s.strip() for s in a_list] 

使用生成器表達式可能是一個更好的辦法,就像這樣:

stripped_list = (s.strip() for s in a_list) 

提供惰性計算的好處,所以strip只有當給定的運行元素,剝離,是必要的。

如果您需要在列表的引用保持不變當前範圍之外,你可能需要使用列表切片語法:

a_list[:] = [s.strip() for s in a_list] 

對於有興趣的各種方法的速度提意見,它看起來好像在CPython的發電機到切片的方法是最有效的:

>>> from timeit import timeit as t 
>>> t("""a[:]=(s.strip() for s in a)""", """a=[" %d " % s for s in range(10)]""") 
4.35184121131897 
>>> t("""a[:]=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""") 
2.9129951000213623 
>>> t("""a=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""") 
2.47947096824646 
+0

爲什麼說「應該稍微高效」而不是分析和檢查?而BTW'[:]'是有用的,因爲它會改變同一個列表,而不是將變量重新賦值給一個新列表。 – Kos

+2

*效率較低,因爲它必須複製N個項目,而不是將參考替換爲列表。您可能不需要或不想要的唯一「優勢」是,任何對原始列表對象具有其他引用的人都可以看到該更改。 – delnan

+0

imho,這是unpythonic。 –

18

你可以使用列表內涵

stripped_list = [j.strip() for j in initial_list] 
+0

你認爲列表推導使代碼工作更快嗎?或只是更小? – Surya

+0

列表推導對於具有簡單規則的可迭代對象非常有效。您可以根據複雜性使用地圖和列表解析。但是,是的,他們提供了一個快速高效的實現 – karthikr

7

上表現了一些有趣的討論發生在這裏,所以讓我提供一個基準:

http://ideone.com/ldId8

noslice_map    : 0.0814900398254 
slice_map    : 0.084676027298 
noslice_comprehension : 0.0927240848541 
slice_comprehension  : 0.124806165695 
iter_manual    : 0.133514881134 
iter_enumerate   : 0.142778873444 
iter_range    : 0.160353899002 

所以:

  1. map(str.strip, my_list)是最快的方法,它只是有點快比coperhensions。
    • 使用mapitertools.imap如果有,你要應用(如str.split)
    • 使用內涵,如果有一個更復雜的表達式
  2. 手冊迭代是最慢的方式單一功能;一個合理的解釋是,它要求解釋者做更多的工作和高效率的C運行時不會少
  3. 來吧,然後將結果像my_list[:] = map...,切片標誌只介紹一個小的開銷,並有可能如果要饒你一些錯誤存在是對該列表的多個引用。
    • 知道變異的列表並重新創建它之間的差別。
+0

你的意思是'my_list = map(str.strip,list [:])'?因爲另一種方式給了我一個NameError。 – Izkata

+0

我的意思是'my_list [:] =地圖(str.strip,my_list)'。查看鏈接下的代碼。 – Kos

相關問題