2013-02-22 14 views
5

私は以下の問題があります。整数のリストを持つので、元の入力リストの2つの要素の間のステップが1でないときはいつでも、リストのリストに分割したいと思います。 例:input = [0,1,3,5,6,7,8] 7]、出力= [[0,1]、[3]、[5,6,7]]Python:それらの間のステップに基づく整数の分割リスト

私は次の機能を書いていますが、それは地獄のように醜いです。より良いソリューションを手に入れるのに役立ちます。私はitertoolsを使用しようとしましたが、解決できませんでした。

ここに私のソリューションです:

def _get_parts(list_of_indices): 
    lv = list_of_indices 
    tuples = zip(lv[:-1], lv[1:]) 
    split_values = [] 
    for i in tuples: 
     if i[1] - i[0] != 1: 
      split_values.append(i[1]) 
    string = '/'.join([str(i) for i in lv]) 
    substrings = [] 
    for i in split_values: 
     part = string.split(str(i)) 
     substrings.append(part[0]) 
     string = string.lstrip(part[0]) 
    substrings.append(string) 
    result = [] 
    for i in substrings: 
     i = i.rstrip('/') 
     result.append([int(n) for n in i.split('/')]) 
    return result 

どうもありがとう!

答えて

7

これは、ここで任意の反復可能

>>> from itertools import groupby, count 
>>> inp = [0, 1, 3, 5, 6, 7] 
>>> [list(g) for k, g in groupby(inp, key=lambda i,j=count(): i-next(j))] 
[[0, 1], [3], [5, 6, 7]] 
+4

すてきな解決策。私は説明が役に立つと思います: 'j = count()'はカウンタを作成します。 'next(j)'を呼び出すたびに1ずつintステップが返されます。 Pythonの動作が分かりません:関数の引数のデフォルト値は関数作成時に一度作成されます。したがって、 'j'はcount()で一度だけ初期化され、' key'への次の呼び出しでは、arg'j'はインスタンスが前に作成されます。 'groupby'は同じキー値を持つ' inp'のすべての項目を 'it'' iterableに追加します。キーの値が変更された場合、新しいgが作成されます。 inp:item = 0、key = 0-0 = 0のアイテムの場合、項目= 1、キー= 1-1 = 0;アイテム= 3、キー= 3-2 = 1; item = 5、key = 5-3 = 2などとなります。 – stalk

2
def _get_parts(i, step=1): 
    o = [] 
    for x in i: 
     if o and o[-1] and x - step == o[-1][-1]: 
      o[-1].append(x) 
     else: 
      o.append([x]) 
    return o 

_get_parts([0, 1, 3, 5, 6, 7], step=1) 
# [[0, 1], [3], [5, 6, 7]]) 
+0

どうもありがとう!!!!! – user1863555

0

で動作するループのために活用したソリューションです。

def splitbystep(alist): 
    newlist = [[alist[0]]] 
    for i in range(1,len(alist)): 
    if alist[i] - alist[i-1] == 1: 
     newlist[-1].append(alist[i]) 
    else: 
     newlist.append([alist[i]]) 
    return newlist 
0

これは、私はそれを行うだろうかです:

inp = [0, 1, 3, 5, 6, 7] 
base = [] 

for item in inp: 
    if not base or item - base[-1][-1] != 1: # If base is empty (first item) or diff isn't 1 
     base.append([item])     # Append a new list containing just one item 
    else: 
     base[-1].append(item)    # Otherwise, add current item to the last stored list in base 
print base         # => [[0, 1], [3], [5, 6, 7]] 
関連する問題