2011-12-05 9 views
9

koncepcyjnej, chcę zrobić:W python, w jaki sposób można jednocześnie ustawić wiele wartości z listy na zero?

arr[20:] = 0 

gdzie arr jest list. Jak mogę to zrobić?

+0

Yup. To lista, przepraszam. –

+0

Byłoby miło, gdyby jakiekolwiek rozwiązanie, z którego korzystasz z wdziękiem, zajmowało się przypadkiem, w którym pierwotny rozmiar listy jest krótszy niż 20 sztuk. – PaulMcG

+0

Cóż, zgrabne zachowanie, którego oczekiwałbym, to pozostawienie listy 20 lub mniej przedmiotów nietkniętych. Pętla 'xrange' robi to, jak sądzę, ponieważ nie ma wartości" i "do iteracji. Ale to nie ma znaczenia dla mojej aplikacji, ponieważ hackuję to razem i wiem, że zawsze mam 10 000 punktów danych. –

Odpowiedz

21

Możesz to zrobić bezpośrednio, korzystając z przypisania plasterków.

arr[20:] = [0] * (len(arr) - 20) 

Ale naturalnym sposobem jest po prostu powtórzenie.

for i in xrange(20, len(arr)): 
    arr[i] = 0 
+1

Co z 'arr [20:] = [0 dla i w zakresie (20, len (arr))] '? Czy nie powinno to być również w tej odpowiedzi? –

+0

Ponieważ OP wie, że arr ma zawsze 10 000 pozycji, i zakładając, że jest to operacja, która będzie musiała być wykonana dość często, to może być pewna korzyść w obliczaniu "trailing_zeros = [0] * (10000-20)", a następnie po prostu robi 'arr [20:] = trailing_zeros' kiedy jest to potrzebne. – PaulMcG

0

Możesz utworzyć funkcję, która spowoduje przekazanie tablicy do tej wartości, która wyzeruje tablicę. Od jakiegoś czasu nie używam Pythona, więc nie będę próbował pokazać kodu Pythona. W tej funkcji można użyć pętli for lub while do iteracji każdej wartości i ustawienia każdej z nich równej zero.

5

Oto kilka opcji:

Lista rozumienie

>>> a = [1]*50 
>>> a = [aa if i < 20 else 0 for i,aa in enumerate(a)] 
>>> a 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

Lista przypisanie plaster:

>>> a = [1]*50 
>>> a[20:] = [0 for aa in a[20:]] 
>>> a 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

Zip (* zip):

>>> a = [1]*50 
>>> a[20:] = zip(*zip(a[20:],itertools.repeat(0)))[1] 
+5

Nominuję przykład zip do włączenia do najczęściej zadawanych pytań w Pythonie. Gnarly! – Dave

0

Jeśli wykorzystaj zrozumienie listy y Tworzymy kopię listy, więc marnujemy pamięć. Użyj spisywania ze zrozumieniem lub tworzenia przekrojów, aby tworzyć nowe listy, a następnie użyj ich do poprawnego ustawienia elementów listy.

Powiązane problemy