2016-10-19 1 views
-1

meine erste Frage, also bitte sei sanft, ich hoffe, ich bekomme die Formatierung richtig :) Ich denke, die Frage ist selbsterklärend. Ich suche nach einem besseren/schnelleren Weg, einen Unterschied in einer Reihe von Zahlen zu finden ... vielleicht möchte ich eine Toleranz damit. Alles, was ich kam, ist:Finden Sie einen bestimmten Unterschied zwischen Mitgliedern einer Liste (oder Set) von Zahlen

def difference(numbers,diff,tol): 
    '''diff is the searched difference,numbers is a list \ 
    of numbers and tol the tolerance''' 
    numbers.sort() 
    match=set() 
    for i in numbers: 
     low = i+diff-tol 
     high= i+diff+tol 
     for k in numbers: 
       if k > high: 
        break 
       if k < low: 
        continue 
       match.add(i) 
       match.add(k) 
    return match 

Aber ich wette, es gibt viel bessere Möglichkeiten, um das Ergebnis zu erreichen.

Jede Idee ist willkommen,

Christian

+5

* „die Frage ist selbsterklärend“ * - es würde nicht schaden, zu klären, was genau meinen Sie, wenn Sie „Unterschied zwischen den Mitgliedern einer Liste“ sagen ... – deceze

+4

ich kann nichts in diese scheinen zu verstehen " selbsterklärende Frage ". – Peaceful

+3

Es war auch nicht klar für mich. Was meinst du mit" Toleranz "und" Diff "Parameter s? – felipsmartins

Antwort

0

Sie vermeiden konnte, den untersten Teil der Zahlen in der zweiten Schleife läuft (keine Notwendigkeit für low, nur Zahlen prüfen voraus)

Mit diesem Sie kann die set fallen lassen und stattdessen eine list verwenden: weniger Hashing, weniger Verarbeitung. Ändern Sie auch nicht die numbers Eingabe, indem Sie es sortieren, der Anrufer kann es nicht erwarten. Verwenden Sie eine lokal sortierte Liste statt (der andere Vorteil ist, dass numbers jetzt ein set sein kann, ein deque ...:

def difference(numbers,diff,tol): 
    '''diff is the searched difference,numbers is a list 
    of numbers and tol the tolerance''' 
    snum = sorted(numbers) 
    match=list() 
    for i,n in enumerate(snum): 
     high= n+diff+tol 
     for j in range(i+1,len(snum)): 
       k = snum[j] 
       if k > high: 
        break 
       match.append(n) 
       match.append(k) 
    return match 

(vielleicht das wäre eine bessere Frage für Code-Review sein, ist die Grenze dünn)

+0

Danke für das konstruktive Feedback. – Christian

0
count = len(numbers) 
    numbers1 = numbers[:count - 1] 
    numbers2 = numbers[1:] 

    for i in range(0, count - 1): 
     dif = numbers2[i] - numbers1[i] 
     if abs(dif) <= tol: 
      match.add(numbers1[i]) 
      match.add(numbers2[i]) 
+0

Bitte überlegen Sie, die Antwort zu verbessern, die für Sie nützlich war. – MarianD

Verwandte Themen