2017-06-25 3 views
0

Betrachten Sie die folgende Struktur angezeigt -Efficient Weise oberes Dreieck Teil-Matrix als Liste in Python

68 69 70 71 72 * 
73 74 75 76 * 77 
78 79 80 * 81 82 
83 84 * 85 86 87 
88 * 89 90 91 92 
* 93 94 95 96 97 

Ich habe zu erzeugen, eine Liste der oberen Hälfte dh

[68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 83, 84, 88] 

Die Struktur ist einfach Zur Erläuterung sind nur zwei Werte gegeben, Start und Länge, wie im obigen Fall start=68 und length = 5.

Hier ist mein Code, um die Liste zu erzeugen -

start = 68 
length = 5 

ls = [] 
for i in range(length): 
    for j in range(length-i): 
     ls.append(start) 
     start = start+1 
    start = start+i 

print(ls) 

Gibt es eine effizientere Art und Weise, das gleiche zu erreichen?

Antwort

5

Sehen Sie sich die innere Schleife an, wo Sie nur zusammenhängende Nummern anhängen. Ersetzen Sie es mit einem extend:

length = 5 
start = 68 

ls = [] 
for cnt in range(length): 
    ls.extend(range(start+length*cnt, start+length*(cnt+1)-cnt)) 
+0

Es ist viel schneller als mein Code. Funktioniert gut in meinem Anwendungsfall, aber es gibt Speicherfehler für große Längen wie 99999. Es wäre interessant zu wissen, wie Sie das angehen werden. –

+0

Wenn 'length = 99999', erzeugen Sie eine Liste mit 5 Milliarden Ganzzahlen. In der Praxis müssten Sie diese Liste wahrscheinlich gar nicht erstellen. Sie könnten stattdessen einfach eine Funktion schreiben, um zu bestimmen, ob eine Zahl "x", für einen gegebenen "Start" und "Länge", im Satz wäre. – danyamachine

+0

@ShivendraSingh Das ist viel zu groß ein Anwendungsfall für diesen Code. Betrachten Sie verteiltes Computing oder etwas Ähnliches. –

0
from itertools import chain 

length = 5 
start = 68 
ls = list(chain.from_iterable(range(start+i*length,start+i*length+length-i) for i in range(length))) 
0

@ Daniel Antwort sehr sauber und präzise ist. Hier ist eine ausführlichere Version, die Sie könnte helfen, verstehen, warum Sie mit diesem nur einer n-size Schleife erreichen können:

def top_half(start, length): 
    output = [] 
    # current length is the number of ints we want to grab from our current line 
    current_length = length 
    # current start is the int at the beginning of the line we are on 
    current_start = start 
    for i in range(length): 
    output = output + range(current_start, current_start+current_length) 
    current_start = current_start + length 
    current_length = current_length - 1 
    return output 

Wir können dies neu schreiben, ohne Variablen für current_start und current_length Speicherung:

def top_half(start, length): 
    output = [] 
    for i in range(length): 
    output = output + range(start + length * i, start + length * i + length - i) 
    return output 

EDIT: Ich bin nicht vorgeschlagen, dass Sie diesen Code verwenden! Diese Antwort dient nur zur Veranschaulichung.