Muszę przeszukać listę i zastąpić wszystkie wystąpienia jednego elementu innym. Jak dotąd moje próby kodu nie prowadzą mnie nigdzie, jaki jest najlepszy sposób, aby to zrobić?
Załóżmy na przykład, że moja lista ma następujące liczby całkowite
>>> a = [1,2,3,4,5,1,2,3,4,5,1]
i muszę zastąpić wszystkie wystąpienia liczby 1 wartością 10, więc potrzebuję wyniku
>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
Dlatego moim celem jest zastąpienie wszystkich wystąpień liczby 1 liczbą 10.
Odpowiedzi:
źródło
Spróbuj użyć listy i operatora trójskładnikowego .
źródło
a
prawda? Myślę, że OP chciała
się zmienića
należy mutować, ale (jak pokazuje Alekhya) proste jest zajmowanie się każdym z tych przypadków przy użyciu listy.a
, powinieneś to zrobića[:] = [4 if x==1 else x for x in a]
(zwróć uwagę na pełny wycinek listy). Samoa =
utworzenie spowoduje utworzenie nowej listya
z innąid()
(tożsamością) od oryginalnejZrozumienie listy działa dobrze, a przechodzenie przez wyliczanie może zaoszczędzić trochę pamięci (b / c operacja jest zasadniczo wykonywana na miejscu).
Istnieje również programowanie funkcjonalne. Zobacz użycie mapy :
źródło
lambda
imap
są uważane za niepythonic.Jeśli masz kilka wartości do zastąpienia, możesz również użyć słownika:
źródło
n
nie można go znaleźć wdic
?n
nie zostanie znaleziona. Mam nadzieję, że nie masz nic przeciwko. Twojetry/except
rozwiązanie nie było dobre.try-except
jest co najmniej 50% szybszy! Spójrz na tę odpowiedźif n in dic.keys()
jest zły pod względem wydajności. Użyjif n in dic
lubdic.get(n,n)
(wartość domyślna)źródło
Możesz użyć pętli for i lub while; jednak jeśli znasz wbudowaną funkcję wyliczania, zaleca się użycie wyliczenia. 1
źródło
Aby wymienić łatwo wszystko
1
ze10
wa = [1,2,3,4,5,1,2,3,4,5,1]
można użyć następującego jedna linia kombinację lambda + mapę i "Spójrz, mamo, nie ma IFS lub Fors! :# This substitutes all '1' with '10' in list 'a' and places result in list 'c':
c = list(map(lambda b: b.replace("1","10"), a))
źródło
lambda
każdego elementu listy ...Poniżej przedstawiono bardzo bezpośrednią metodę w Pythonie 2.x
Ta metoda działa. Komentarze są mile widziane. Mam nadzieję, że to pomoże :)
Spróbuj także zrozumieć, jak działają rozwiązania outis i damzam . Kompresje list i funkcja lambda są przydatnymi narzędziami.
źródło
Wiem, że to bardzo stare pytanie i istnieje mnóstwo sposobów, aby to zrobić. Znalazłem prostszy
numpy
pakiet.źródło
Mój przypadek użycia został zastąpiony
None
pewną wartością domyślną.Podjęłam czasowe podejście do tego problemu, które zostały tutaj zaprezentowane, w tym ten autorstwa @kxr - using
str.count
.Testuj kod w ipython z Python 3.8.1:
Dostaję:
Korzystanie z wewnętrznego
str.index
jest w rzeczywistości szybsze niż jakiekolwiek ręczne porównanie.Nie wiedziałem, czy wyjątek w teście 4 byłby bardziej pracochłonny niż używanie
str.count
, różnica wydaje się znikoma.Zauważ, że
map()
(test 6) zwraca iterator, a nie rzeczywistą listę, dlatego test 7.źródło
Na długich listach i rzadkich zdarzeniach jest to około 3 razy szybsze użycie
list.index()
- w porównaniu do metod iteracji jednoetapowych przedstawionych w innych odpowiedziach.źródło
Możesz po prostu użyć listy ze zrozumieniem w Pythonie:
w twoim przypadku, w którym chcesz zastąpić wszystkie wystąpienia 1 liczbą 10, fragment kodu będzie wyglądał następująco:
źródło
Znajdź i zamień tylko jeden element
źródło