2013-03-09 122 views
4

名單我有對象的列表,我希望得到的對象的名單列表,使用對象從另一個列表中,這樣的分裂:分裂在python

l = ['x',1,2,3,'a',5,6,1,7] 

和對象

的另一個列表
s = ['a', 1, 4] 

我希望得到的結果如此:

[ ['x'], [1, 2, 3], ['a', 5, 6], [1, 7] ] 

是否有一個很好的/ Python的方式做到這一點?

編輯:

我希望每個頭導致列表是s的元素,所有這些列表,以保持初始列表中的元素以相同的順序。

+1

所以它是隨機分割或是第二個列表的位置切割o ff個人名單?我只是問,因爲在第一個列表中沒有4 – erdekhayser 2013-03-09 14:59:42

+0

那麼你想告訴我們你用什麼邏輯來分割列表? – IcyFlame 2013-03-09 15:02:25

+0

你想要的東西。 [檢查此](http://stackoverflow.com/a/6696059/2115255) – 2013-03-09 15:03:48

回答

2

嘗試這些2個功能,

  1. 的 '返回' 類型

    def overlap_split_list(l,s): 
        l1 = [] 
        l2 = [] 
        for i in l: 
         if i in s: 
          l1.append(l2) 
          l2 = [] 
         l2.append(i) 
        if l2: l1.append(l2) 
        return l1 
    
  2. 發電機類型

    def generator_overlap_split_list(l,s): 
        l2 = [] 
        for i in l: 
         if i in s: 
          yield l2 
          l2 = [] 
         l2.append(i) 
        if l2: yield l2 
    

對於輸出(都將是相同的)

print overlap_split_list(l,s)  
print [i for i in generator_overlap_split_list(l,s)] 
print list(generator_overlap_split_list(l,s)) 
+0

'overlap_split_list'實際上是這裏提交的所有函數中最快的。 – Gandaro 2013-03-09 15:43:08

+0

@Gandaro是的,因爲沒有任何「外力」作用於它,即在發電機的情況下,有來自外部的個別呼叫,這需要時間(撥打電話)。 – pradyunsg 2013-03-09 16:01:32

5

發電機會爲你做的一個瞬間:

def split_on_members(seq, s): 
    s = set(s) 
    chunk = [] 
    for i in seq: 
     if i in s and chunk: 
      yield chunk 
      chunk = [] 
     chunk.append(i) 
    if chunk: 
     yield chunk 

這給:

>>> list(split_on_members(l, s)) 
[['x'], [1, 2, 3], ['a', 5, 6], [1, 7]] 

你可以只在產生循環,而無需創建過程的完整列表:

>>> for group in split_on_members(l, s): 
...  print group 
... 
['x'] 
[1, 2, 3] 
['a', 5, 6] 
[1, 7]