2017-07-12 9 views
5

Mam listę 2D 416 wierszy, każdy wiersz ma 4 kolumny. Wiersze 1-4 zawierają ich liczba wiersz 4 razy (tj [...[1,1,1,1],[2,2,2,2]...]. Wiersz 330 zawiera [41,22,13,13]. Wszystko inne jest [0,0,0,0]. Obecnie używam dla pętli z wielu wyraźny if.Jak zdefiniować dużą tablicę listy w Pythonie za pomocą pętli For lub Vectorization?

myList = [[0,0,0,0]] 
for i in range(1, 416): 
    if i == 1 or i == 2 or i == 3 or i == 4: 
     myList.append([i,i,i,i]) 
    elif i == 330: 
     myList.append([41,22,13,13]) 
    else: 
     myList.append([0,0,0,0]) 

Co jest bardziej wydajny sposób dla mnie, aby zdefiniować tę tablicę?

Inne pytania, które widziałem na SO nie wydają się wyraźnie zwrócić się do tego pytania, ale jeśli ktoś znajdzie taki, który może być uważany za duplikat, proszę oznaczyć to pytanie jako takie, a ja zaakceptuj to:

+0

czy to musi być "lista" czy inne formaty są w porządku? – patrick

+0

Wolałbym listę. Ale! Najważniejsze, na czym mi zależy, to wynik końcowy, więc jeśli znacie inną, lepszą metodę, rzućcie to na mnie. – SeeDerekEngineer

+2

Czy obejrzałeś numpy arrays? Podobnie jak w przypadku odpowiedzi Mosesa, zacznę od np.zeros, a następnie dostosuję niezbędne wiersze. – mauve

Odpowiedz

7

Ponieważ większość liście jest podmenu zer (w perspektywie tablicy, rzadki), ja po prostu przydzielenia a następnie użyć zadanie plaster/indeksowanie aktualizacji:

my_list = [[0, 0, 0, 0] for _ in range(416)] 
my_list[330] = [41,22,13,13] 
my_list[1:5] = [[i]*4 for i in range(1, 5)] 

to uniknąć ponownej oceny oddział dla wielu fałszywych przypadków oraz powtarzających dodaje.

OTOH, mając zera w całej pamięci można uniknąć, jeśli rzeczywiście zachować strukturę danych jako rzadką matrycę. Możesz rzucić okiem na SciPy 2-D sparse matrix package.

+0

Z pewnością właściwy pomysł, ale wynik z ich fragmentu kodu nie jest równy temu wynikowi (ich wyniki mogą być błędne) –

+0

@Chris_Rands Powiem, że ich wyniki są błędne. Oni wstępnie przypisują 'myList = [[]]'. –

+1

Jeśli 'moja_lista 'nie będzie modyfikowana, możesz nawet powiedzieć' zero_list = [0, 0, 0, 0] ', a następnie zacząć od' my_list = [lista_wylatów dla _ w zakresie (416)], zapisując czas i pamięć używane do tworzenia niepotrzebnych list. – jdehesa

1

Z góry mojej głowy y prosty i szybki sposób, aby to zrobić:

import itertools 

answer = list(itertools.chain([[i,i,i,i] for i in range(1,5)], [[0,0,0,0] for _ in range(330-6)], [[41,22,13,13]], [[0,0,0,0] for _ in range(416-330)])) 
Powiązane problemy