Ich habe eine Funktion sumranges(), die alle Bereiche aufeinanderfolgender Zahlen in einem Tupel-Tupel summiert. Zur Veranschaulichung:Konsekutive Bereiche pythonisch summieren
def sumranges(nums):
return sum([sum([1 for j in range(len(nums[i])) if
nums[i][j] == 0 or
nums[i][j - 1] + 1 != nums[i][j]]) for
i in range(len(nums))])
>>> nums = ((1, 2, 3, 4), (1, 5, 6), (19, 20, 24, 29, 400))
>>> print sumranges(nums)
7
Wie Sie sehen können, ist es, die Anzahl der Bereiche von aufeinander folgenden Stellen innerhalb des Tupel zurückgibt, das heißt: len ((1, 2, 3, 4), (1), (5, 6), (19, 20), (24), (29), (400)) = 7. Die Tupel sind immer geordnet.
Mein Problem ist, dass mein sumranges() ist schrecklich. Ich hasse es, es anzuschauen. Ich wiederhole gerade das Tupel und jedes Sub-Tupel, gebe eine 1 zu, wenn die Zahl nicht (1 + vorherige Zahl) ist, und addiere die Summe. Ich habe das Gefühl, dass mir ein viel einfacherer Weg fehlt, um mein erklärtes Ziel zu erreichen. Kennt jemand eine mehr pythische Art, dies zu tun?
Edit: Ich habe alle bis jetzt gegebenen Antworten bewertet. Danke an euch alle für eure Antworten.
Das Benchmarking-Code ist wie folgt, eine Stichprobengröße von 100 K mit:
from time import time
from random import randrange
nums = [sorted(list(set(randrange(1, 10) for i in range(10)))) for
j in range(100000)]
for func in sumranges, alex, matt, redglyph, ephemient, ferdinand:
start = time()
result = func(nums)
end = time()
print ', '.join([func.__name__, str(result), str(end - start) + ' s'])
Ergebnisse sind wie folgt. Die tatsächliche Antwort zu verifizieren gezeigt, dass alle Funktionen, die richtige Antwort zurück:
sumranges, 250281, 0.54171204567 s
alex, 250281, 0.531121015549 s
matt, 250281, 0.843333005905 s
redglyph, 250281, 0.366822004318 s
ephemient, 250281, 0.805964946747 s
ferdinand, 250281, 0.405596971512 s
RedGlyph nicht Kante in Bezug auf Geschwindigkeit, aber die einfachste Antwort ist wahrscheinlich Ferdinands, und wahrscheinlich gewinnt für die meisten pythonic.
Das ist wirklich glatt. –
Ah, ich hatte das "Tupel sind immer geordnet" -Bit in der Frage verpasst - das Bit _macht_ diese Antwort vorzuziehen (meine würde für beliebige Tupel funktionieren, nicht nur für geordnete, aber dafür gibt es einen kleinen Preis Allgemeinheit). –