2016-01-11 22 views
5

Diziler için bölünecek eşdeğer var mı?Python dizilerle bölme kullanımı

a = [1, 3, 4, 6, 8, 5, 3, 4, 5, 8, 4, 3] 

separator = [3, 4] (len(separator) can be any) 

b = a.split(separator) 

b = [[1], [6, 8, 5], [5, 8, 4, 3]] 
+0

Hayır, yok; bu nasıl mantıklı olurdu? Bulunduğunuz çağrıda 'separatör 'bile dahil değilsiniz. – jonrsharpe

+0

listelerin bir listesi mi olmalı yoksa sadece ayırıcınızla eşleşen alt dizileri mi ayırmak istiyorsunuz? – jkalden

+1

['itertools.groupby'] 'ye (http://stackoverflow.com/questions/14529523/python-split-for-lists) baktınız mı? – TigerhawkT3

cevap

3

Hayır, ancak böyle bir şeyi yapmak için bir işlev yazabiliriz ve sonra bir örnek yöntemi olarak ihtiyacınız varsa listeyi alt sınıflara ayırabilir veya kapsülleyebilirsiniz. Eğer örnek yöntemi olarak çalışmak için bu isteseydim

def separate(array,separator): 
    results = [] 
    a = array[:] 
    i = 0 
    while i<=len(a)-len(separator): 
     if a[i:i+len(separator)]==separator: 
      results.append(a[:i]) 
      a = a[i+len(separator):] 
      i = 0 
     else: i+=1 
    results.append(a) 
    return results 

, listeyi saklanması için aşağıdaki yapabilirdi:

class SplitableList: 
    def __init__(self,ar): self.ary = ar 
    def split(self,sep): return separate(self.ary,sep) 
    # delegate other method calls to self.ary here, for example 
    def __len__(self): return len(self.ary) 

a = SplitableList([1,3,4,6,8,5,3,4,5,8,4,3]) 
b = a.split([3,4]) # returns desired result 

ya da biz şöyle listesini alt sınıf olabilir:

class SplitableList(list): 
    def split(self,sep): return separate(self,sep) 

a = SplitableList([1,3,4,6,8,5,3,4,5,8,4,3]) 
b = a.split([3,4]) # returns desired result 
+0

[1, 3,4] için işe yaramadığını düşünüyorum, [[1], []] yerine [[1], []] yerine dönecektir –

+0

Haklısınız ve boş listeden emin değildim meydana gelmeli ya da olmamalıdır (eğer arzu dizge operatörü gibi davranacaksa). Bunu çözmek için kodu düzenledim. – Matthew

+0

Şimdi iyi görünüyor :) –

0

Bir sayısal olmayan ayırıcı kullanarak bir dizeye liste katılabileceğini, sonra bölünmüş yapın: dizede

>>> s = " {} ".format(" ".join(map(str, a))) 
>>> s 
' 1 3 4 6 8 5 3 4 5 8 4 3 ' 
>>> [[int(y) for y in x.split()] for x in s.split(" 3 4 ")] 
[[1], [6, 8, 5], [5, 8, 4, 3]] 

2 fazladan boşluklar uç örnekleri göz önünde (örn a = [1, 3, 4]) .

3

Hayır yok. Kendi

yazmak zorunda yoksa bu alacak: Büyük diziler üzerinde verimlilik (50 x) için

def split(a, sep): 
    pos = i = 0 
    while i < len(a): 
     if a[i:i+len(sep)] == sep: 
      yield a[pos:i] 
      pos = i = i+len(sep) 
     else: 
      i += 1 
    yield a[pos:i] 

print list(split(a, sep=[3, 4])) 
0

, kullanılabilecek bir np.split yöntem yoktur.

from pylab import * 
a=randint(0,3,10) 
separator=arange(2) 
ind=arange(len(a)-len(separator)+1) # splitting indexes 
for i in range(len(separator)): ind=ind[a[ind]==separator[i]]+1 #select good candidates 
cut=dstack((ind-len(separator),ind)).flatten() # begin and end 
res=np.split(a,cut)[::2] # delete separators 
print(a,cut,res) 

verir: zorluk ayırıcısını silmektir

[0 1 2 0 1 1 2 0 1 1] [0 2 3 5 7 9] [[],[2],[1, 2],[1]]