2012-02-15 70 views
2

split至少X結果有maxsplit參數,當你想最多 X的結果,這是有用。如果有類似的東西返回至少 X結果與None小號填充休息。我希望能寫返回從分裂

a, b, c = 'foo,bar'.magic_split(',', 3) 

,並有a=foob=barc=None

任何想法如何寫這樣的功能?

UPD。我結束了一個解決方案,它是thisthis答案的組合:

>>> def just(n, iterable, fill=None): 
...  return (list(iterable) + [fill] * n)[:n] 
... 
>>> just(3, 'foo,bar'.split(',')) 
['foo', 'bar', None] 
+0

沒有明確的辦法可以做到這一點,所以你應該這樣做。改用普通列表。 – DrTyrsa 2012-02-15 13:24:07

+0

我同意DrTyrsa,你想要做什麼的背景是什麼? – 2012-02-15 13:39:19

回答

1

沒有這樣的參數str.split()。實現這一點的黑客將是

a, b, c = ('foo,bar'.split(',', 2) + [None] * 3)[:3] 

不知道我是否推薦此代碼,但。

+0

您可能想將split(',',2)'更改爲split(',',1)' – 2012-02-15 13:13:11

+0

@RomanBodnarchuk:問題已被編輯,所以我不得不調整我的答案。有點混亂,我想。 – 2012-02-15 13:15:14

+0

令人驚歎!我認爲第二個'2'應該是'3'來處理空的arg + sep = None的邊界情況。 – georg 2012-02-15 22:24:25

5

一種方法是:

from itertools import chain 
from itertools import repeat 
from itertools import islice 

def magic_split(seq, sep, n, def_value=None): 
    return list(islice(chain(seq.split(sep), repeat(def_value)), n)) 

你可以只返回islice的返回值,如果你不需要的列表。

如果你不想被切斷值時,n小於序列裂元件的數量,修改很簡單:

def magic_split(seq, sep, n, def_value=None): 
    elems = seq.split(sep) 
    if len(elems) >= n: 
     return elems 

    return list(islice(chain(elems, repeat(def_value)), n)) 
+0

您應該將'n - 1'作爲第二個參數傳遞給'seq.split()'。 – 2012-02-15 13:20:52

+0

@SvenMarnach爲什麼?我只是測試它,它的工作原理如問題中所述。 'magic_split( '富,酒吧', ' '3)'返回'[' 富', '酒吧',無]'所以至少3個元素,他們'None' – soulcheck 2012-02-15 13:24:15

+0

由於用於用例的一個'一個,b,c = magic_split(...)重要的是你的函數的返回值只是* 3個項目,而不是至少3個項目。 – 2012-02-15 13:27:14

1

我會用一個更一般的功能爲:

def fill(iterable, n): 
    tmp = tuple(iterable) 
    return tmp + (None,)*(n - len(tmp)) 

然後:

a, b, c = fill('foo,bar'.split(','), 3) 
+0

謝謝!使用包裝似乎是最乾淨的解決方案 – georg 2012-02-15 22:24:54

1

既然你問了一個字符串的方法,您可以通過derivin啓動g from str:

>>> class magicstr(str): 
    def magic_split(self, sep=None, mlen=0): 
     parts = self.split(sep) 
     return parts + [None]* (mlen - len(parts)) 


>>> test = magicstr("hello there, ok?") 
>>> test.magic_split(",", 3) 
['hello there', ' ok?', None]