2012-08-29 204 views
1

string.partition好的做法有時我寫這樣的代碼:在蟒蛇

a,temp,b = s.partition('-') 

我只需要選擇第一個和第三個元素。 temp永遠不會被使用。有一個更好的方法嗎?

換句話說,是否有更好的方法來挑選不同的元素來創建一個新的列表?

例如,我想使用舊列表中的元素0,1,3,7創建一個新列表。該 代碼將是這樣的:

newlist = [oldlist[0],oldlist[1],oldlist[3],oldlist[7]] 

這是非常醜陋的,是不是?

+0

我不明白如何使它變得更漂亮,除非你想寫一個函數或將舊列表重命名爲更短的東西。 – Loopo

回答

3

您可以使用Python的擴展切片功能來訪問定期列表:

>>> a = range(10) 
>>> # Pick every other element in a starting from a[1] 
>>> b = a[1::2] 
>>> print b 
>>> [1, 3, 5, 7, 9] 

負索引原理正如你所期望:

>>> c = a[-1::-2] 
>>> print c 
>>> [9, 7, 5, 3, 1] 

爲你的情況,

>>> a, b = s.partition('-')[::2] 
5

對於第一個有這個也是另類:

a, b = s.partition('-')[::2] 

對於後者,因爲沒有明確的時間間隔是沒有辦法做到這一點太乾淨。但是,這可能會滿足您的需求:

newlist = [oldlist[k] for k in (0, 1, 3, 7)] 
+1

+1切片方法和列表補全答案。 – sberry

+0

第一次工作時,我不明白,你能解釋一下嗎? – Max

+0

請參考[this](http://stackoverflow.com/questions/509211/good-primer-for-python-slice-notation)瞭解列表切片。 –

2

在Python中常見的做法來接第1和第3的值是:

a, _, b = s.partition('-') 

而且挑選列表中指定的元素,你可以這樣做:用

newlist = [oldlist[k] for k in (0, 1, 3, 7)] 
7

小心

a, _, b = s.partition('-') 

有時_用於國際化(gettext),所以你不會意外覆蓋它。

通常我會爲partition做到這一點,而不是創建一個變量,我不需要

a, b = s.partition('-')[::2] 

,這在一般情況下

from operator import itemgetter 
ig0137 = itemgetter(0, 1, 3, 7) 
newlist = ig0137(oldlist) 

的itemgetter比列表理解更高效如果你在循環中使用它

+0

我喜歡這樣回答關於效率的實際問題,而不是簡單地提供可供選擇的方法來調用。 – mrisher

1

如果你不需要保留中間字段,你可以使用split(和類似的rsplit)與可選maxsplit參數到分裂限制到分離器的第一(或最後)匹配:

a, b = s.split('-', 1) 

這避免了一次性臨時或額外切片。

唯一需要注意的是splitpartition不同,如果未找到分隔符,則返回原始字符串。結果嘗試解包將會失敗。 partition方法總是返回一個3元組。