2016-07-27 9 views

Antwort

4

Sie können es zip mit tun:

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

Suche Splitting Standorte mit Reißverschluss:

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

Scheibe subslists vorheriges Ergebnis mit:

# 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

-Code

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 

-Test

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

Ist das eine Antwort oder eine Ergänzung zu der Frage? – Jerrybibo

+0

Das ist mein Vorschlag, aber ich suche nach besseren Lösungen. – Stefanus

1

hier ein primitiver Stück Code, das, was Sie tun wollen, erreicht, auch wenn es nicht effizient ist (siehe Antwort Reut Sharabani des für eine effizientere Lösung.)

# 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

Ich mag die Klarheit Ihrer Antwort! Wie groß wäre der Leistungsunterschied? – Stefanus

+0

Es sollte nicht wichtig sein, wenn Sie nicht für Millisekundengenauigkeit gehen, aber ich werde bald einige Tests dazu machen. – 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) 
Verwandte Themen