Czy można napisać ładny, Pythonic One-liniowiec na coś, w którym musisz pętli przez elementy listy i ustawić je do niektórych stałej opartych na stanie?

Oto, jak wygląda moja obecna implementacja:

var = [1,2,3,4]
for i in range(len(var)):
    var[i] = 0 if var[i] <= 0 else var[i]

Rozumiem, że możesz użyć normalnego if instrukcji w środku pętli, ale jestem raczej nieznany z całym tym, że Python ma do zaoferowania i szukam czegoś trochę ładniejszego.

Uwaga: Chcę zmodyfikować oryginalną tablicę, nie utwórz nowej (np. Powinno być niektóre (choć być może bardzo niewielkie) dodane przy tworzeniu nowej listy za pomocą rozumienia listy, w przeciwieństwie do modyfikowania oryginalnej tablicy)

0
J-Win 27 czerwiec 2017, 13:52

4 odpowiedzi

Najlepsza odpowiedź

Korzystanie z numpy Możesz użyć Maski indeksowe:

var = numpy.array([...])
var[var < 0] = 0
1
a_guest 27 czerwiec 2017, 10:57

Możesz to zrobić na wiele sposobów, a to jest jeden z nich:

var = [0 if item < 0 else item for item in var]

-1
Sam Chats 27 czerwiec 2017, 10:56

Możesz użyć rozumienia listy i sprawdzić każdy element:

var = [1,2,-3,4]
var = [(i if i > 0 else 0) for i in var]

print(var) # [1, 2, 0, 4]

Tylko dla zabawy w czasie wszystkich obecnych odpowiedzi, które nie polegają na bibliotekach innych firm:

import timeit

print( timeit.timeit( "[(i if i > 0 else 0) for i in var]", setup="var = [1,2,-3,4]", number=1000000 ) )
# 0.6322694380378722
print( timeit.timeit( "[0 if item < 0 else item for item in var]", setup="var = [1,2,-3,4]", number=1000000 ) )
# 0.6328021787321703
print( timeit.timeit( "[max(i,0) for i in var]", setup="var = [1,2,-3,4]", number=1000000 ) )
# 1.4293624092194928
0
Mike Scotty 27 czerwiec 2017, 11:05

Możesz to zrobić :

var = [max(i,0) for i in var]
4
HH1 27 czerwiec 2017, 10:55