2016-07-27 12 views

答えて

4

あなたはジッパーを使用してそれを行うことができます:zipファイルを使用して

# initialization 
>>> lst = [1, 2, 5, 3, -2, -1, 4, 5, 2, 4, 8] 
>>> n = 3 

検索分割場所:前の結果を使用して

>>> indices = [i + 1 for (x, y, i) in zip(lst, lst[1:], range(len(lst))) if n < abs(x - y)] 

スライスsubslists:

# pad start index list with 0 and end index list with length of original list 
>>> result = [lst[start:end] for start, end in zip([0] + indices, indices + [len(lst)])] 
>>> result 
[[1, 2, 5, 3], [-2, -1], [4, 5, 2, 4], [8]] 
1

コード

from boltons import iterutils 

def grouponpairs(l, f): 
    groups = [] 
    g = [] 
    pairs = iterutils.pairwise(l + [None]) 
    for a, b in pairs: 
     g.append(a) 
     if b is None: 
      continue 
     if not f(a, b): 
      groups.append(g) 
      g = [] 
    groups.append(g) 
    return groups 

テスト

grouponpairs([1, 2, 5, 3, -2, -1, 4, 5, 2, 4, 8], lambda a, b: abs(a - b) <= 3) 
# [[1, 2, 5, 3], [-2, -1], [4, 5, 2, 4], [8]] 
+0

これが答えたり、質問に加えますか? – Jerrybibo

+0

これは私の提案ですが、より良い解決策を探しています。 – Stefanus

1

をここですより原始的それは効率的ではないにも関わらず、あなたは何をしたいのか達成したコードの一部(より効率的なソリューションのためのReut Sharabaniの回答を参照してください。)

# Input list 
l = [1, 6, 5, 3, 5, 0, -3, -5, 2] 
# Difference to split list with 
n = 3 

output = [] 
t = [] 
for i in range(1, len(l)): 
    t.append(l[i]) 
    if abs(l[i] - l[i - 1]) < n: 
     None 
    else: 
     output.append(t) 
     t = [] 
return output 
+0

私はあなたの答えの明快さが好きです!パフォーマンスの差はどれくらいでしょうか? – Stefanus

+0

ミリ秒精度で作業していないかどうかは関係ありませんが、すぐにそのテストをいくつか行います。 – Jerrybibo

0
n = 3 
a = [1, 2, 5, 3, -2, -1, 4, 5, 2, 4, 8] 

b = [abs(i - j) > n for i, j in zip(a[:-1], a[1:])] 
m = [i + 1 for i, j in enumerate(b) if j is True] 
m = [0] + m + [len(a)] 
result = [a[i: j] for i, j in zip(m[:-1], m[1:])] 

print(result) 
関連する問題