Rozważ następującą strukturę -

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

Muszę wygenerować listę górnej połowy.

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

Struktura jest tylko w celu wyjaśnienia, tylko dwie wartości są podane, początek i długość, jak w powyższym przypadku start=68 i length = 5.

Oto mój kod, aby wygenerować listę -

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)

Czy istnieje bardziej skuteczny sposób na to samo?

0
Shivendra Singh 25 czerwiec 2017, 19:07

3 odpowiedzi

Najlepsza odpowiedź

Spójrz na wewnętrzną pętlę, w której dołączysz tylko liczby ciągłe. Wymień go jednym extend:

length = 5
start = 68

ls = []
for cnt in range(length):
    ls.extend(range(start+length*cnt, start+length*(cnt+1)-cnt))
5
FreshD 25 czerwiec 2017, 16:35

@ Odpowiedź Daniela jest bardzo czysta i zwięzła. Oto więcej Verbose wersja, która może pomóc zrozumieć, dlaczego można osiągnąć tylko jedną pętlę wielkości N:

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

Możemy ponownie napisać to bez przechowywania zmiennych dla Current_start i Current_Length:

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

Edytuj: Nie sugeruję, że użyjesz tego kodu! Ta odpowiedź dotyczy celów poglądowych.

0
danyamachine 25 czerwiec 2017, 17:22
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
Błotosmętek 25 czerwiec 2017, 16:20