2012-11-10 43 views
4

假設我有一個變量S字符串"1:3"(或就此而言,"1",或"1:"":3"),我想使用,作爲對切片符列表L。你不能簡單地做L[S],因爲一個切片所需的參數是"int:int"。現在的Python:想用一個字符串作爲切片符

,我現在有一些醜陋的代碼解析S到它的兩個組成int S和處理所有邊緣案件(其中4)要拿出正確的片段中的存取,但是這僅僅是醜陋和unpythonic。

如何優雅地採取字符串S並將其用作我的切片說明符?

回答

1

這裏的另一種解決方案

eval("L[%s]" % S) 

警告 - 如果It's not safe S從外部(不可靠)源到來。

+0

您可能想要解釋*爲什麼這是一個糟糕的主意(它肯定是)。 –

+0

好的..做了一個編輯。 – vivek

+0

非常好,簡潔! – staggart

5

這可以通過使用列表理解來避免太多黑客攻擊。我們將字符串拆分爲:,將拆分項作爲參數傳遞給slice()內建。這使我們能夠很好地產生切片一條線,其中,在每一種情況下的工作我能想到的辦法:

slice(*[int(i.strip()) if i else None for i in string_slice.split(":")]) 

通過使用slice()內置,我們巧妙地避免應付太多的邊緣情況我們自己。

實例:

>>> some_list = [1, 2, 3] 
>>> string_slice = ":2" 
>>> some_list[slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])] 
[1, 2] 
>>> string_slice = "::-1" 
>>> some_list[slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])] 
[3, 2, 1] 
+0

更好地使用分割在這裏的分區,因爲我沒有考慮到第三個參數。 – sberry

+0

事實上,它的工作很好。這一個也很好地給你不正確的輸入錯誤(通過抱怨額外的操作數到slice())。 –

+0

非常酷 - 謝謝! – staggart