Chcę napisać coś, co usuwa określony element z tablicy. Wiem, że muszę for
przeszukać tablicę w pętli, aby znaleźć element pasujący do zawartości.
Powiedzmy, że mam tablicę e-maili i chcę pozbyć się elementu, który pasuje do jakiegoś ciągu e-mailowego.
Właściwie chciałbym użyć struktury pętli for, ponieważ muszę użyć tego samego indeksu dla innych tablic.
Oto kod, który mam:
for index, item in emails:
if emails[index] == '[email protected]':
emails.pop(index)
otherarray.pop(index)
list.remove(x)
?Odpowiedzi:
Nie musisz iterować tablicy. Właśnie:
Spowoduje to usunięcie pierwszego wystąpienia, które pasuje do ciągu.
EDYCJA: Po edycji nadal nie musisz jej powtarzać. Po prostu zrób:
źródło
Używanie
filter()
ilambda
zapewniłby zgrabną i zwięzłą metodę usuwania niechcianych wartości:Nie zmienia to e-maili. Tworzy nową listę newEmails zawierającą tylko elementy, dla których funkcja anonimowa zwróciła True.
źródło
Twoja pętla for nie jest poprawna, jeśli potrzebujesz indeksu w pętli for, użyj:
W twoim przypadku rozwiązanie Bogdana jest w porządku, ale wybór struktury danych nie jest dobry. Konieczność utrzymywania tych dwóch list z danymi z jednej powiązanej z danymi z drugiej w tym samym indeksie jest niewygodna.
Lista krotek (e-mail, inne dane) może być lepsza lub dykt z adresem e-mail jako kluczem.
źródło
Rozsądnym sposobem na zrobienie tego jest użycie
zip()
i wyrażenie listy / generatora:Ponadto, jeśli nie używasz
array.array()
lubnumpy.array()
, najprawdopodobniej używasz[]
lublist()
, które dają Ci Listy, a nie Tablice. To nie to samo.źródło
Istnieje alternatywne rozwiązanie tego problemu, które dotyczy również zduplikowanych dopasowań.
Rozpoczynamy od 2 list o równej długości:
emails
,otherarray
. Celem jest usunięcie pozycji z obu list dla każdego indeksu,i
gdzieemails[i] == '[email protected]'
.Można to osiągnąć za pomocą zrozumienia listy, a następnie podzielenia za pomocą
zip
:źródło