2014-06-10 92 views
1

我有這種格式的項目清單:我需要一個列表拆分成一個列表的列表[Python的]

['2', '', '9', '24', '1', '7', '12', '4', '', '18', '13', '34', '3', '10'] 

我需要把它變成由空項目分開列表的列表:

[['2'], ['9', '24', '1', '7', '12', '4'], ['18', '13', '34', '3', '10']] 

我不知道該如何去做。我曾嘗試做一個嵌套循環,但這不符合計劃。

我發現有一種方法可以使用itertools.groupby來完成它,但我無法弄清楚它的語法。

我感謝所有幫助!謝謝!

回答

3
myList = ['2', '', '9', '24', '1', '7', '12', '4', '', '18', '13', '34', '3', '10'] 
newList = [] 
tmp = [] 
for item in myList: 
    if item: 
     tmp.append(item) 
    else: 
     newList.append(tmp) 
     tmp = [] 
newList.append(tmp)   # may need to wrap this in an 
          # "if tmp != []" thingy 
+0

您需要在for循環後添加一個finalList.append(tmp)來獲取最後一個子列表。我有基本相同的解決方案,具有相同的錯誤。 – Marius

+0

abt last array什麼?它不會追加 –

+0

不錯,但你可能需要處理循環之外的最後一部分 - 最後沒有''''強制添加到超級列表中。我已經添加了一種方法。 – paxdiablo

0
a=['2', '', '9', '24', '1', '7', '12', '4', '', '18', '13', '34', '3', '10'] 
temp=[] 
b=[] 
for i in a: 
    if i =='': 
     b.append(temp) 
     temp=[] 
    else: 

     temp.append(i) 
b.append(temp) 
7
>>> from itertools import groupby 
>>> a = ['2', '', '9', '24', '1', '7', '12', '4', '', '18', '13', '34', '3', '10'] 
>>> [list(items) for status, items in groupby(a, lambda v: v != '') if status] 
[['2'], ['9', '24', '1', '7', '12', '4'], ['18', '13', '34', '3', '10']] 

groupby需要一個迭代和功能,並返回分成取決於函數的返回值項集。此示例檢查返回值是否爲True,然後明確輸出列表的列表(因爲這是您在示例中想要的)。

編輯:這是一個稍微更可讀的版本,通過在註釋中@JonClements建議(使用字符串鑄造bool代替lambda功能):

[list(g) for k, g in groupby(a, bool) if k] 

如果你沒有明確需要列表,你也可以做這樣的事情:

>>> for k, v in groupby(a, bool): 
...  if k: 
...   # do something with each group of values (v) 
... 
+2

這就是我要做的方式,但我會用'bool'替換'lambda v:v!='''' –

+1

他們對我喜愛的**可讀** Python語言做了什麼?或者,用一種他們會明白的方式:'[在language.python.desecration()]中的動作動作] :-) – paxdiablo

+0

'[list(g)for k,g in groupby(a,bool)if k]'在這裏很好地工作 –

1

這是一個簡單的單線程。但它不使用itertools。

list = ['2', '', '9', '24', '1', '7', '12', '4', '', '18', '13', '34', '3', '10'] 
    formattedList = [x.split(" ") for x in " ".join(list).split(" ")] 
相關問題