2016-01-11 7 views
5

とスプリットを使用するアレイに分割する任意の等価はありますか?Pythonは配列

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

いいえ、ありません。それはどういう意味ですか?あなたは、あなたの発明された呼び出しに「セパレータ」を含めることさえありません。 – jonrsharpe

+0

それはリストのリストでなければならないのか、あなたは自分の区切りに一致するサブアレイを整理したいですか? – jkalden

+1

あなたは[ 'itertools.groupby'](http://stackoverflow.com/questions/14529523/python-split-for-lists)に見たことがありますか? TigerhawkT3 @ – TigerhawkT3

答えて

3

ありませんが、私たちはそのようなことを行う関数を書くことができ、そしてあなたはそれがインスタンスメソッドである必要があれば、あなたはリストをサブクラス化またはカプセル化できます。

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 

あなたは、これはインスタンスメソッドとして働きたいと思った場合は、我々はリストをカプセル化するために、次の行うことができます:

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 

か、我々はそうのようなリストをサブクラス化することができます:

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]では機能しないと思う、[[1]、[]]の代わりに[[1]]を返します –

+0

あなたは正しいです、そして、 (文字列分割演算子のように動作するようにする必要がある場合)私はそれに対処するコードを編集しました。 – Matthew

+0

今見栄えます:) –

0

あなたは、その後、分割を行い、非数値分離器を使用して文字列にリストに参加できます。

>>> 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つの余分なスペースがエッジケース(例えばa = [1, 3, 4])のアカウントを取ります。

3

をいいえ、ありません。あなたがあなた自身の

を書いたり、このいずれかを実行する必要があります:

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

効率化のために(50×)の大きなアレイで、使用することができnp.split方法があります。 難しさは、セパレータを削除するには、次のとおりです。

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) 

ができます:

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