blog.furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

Jak w Pytonie znaleść wszystkie wystąpienia elementu na liście

Jak znaleść wszystkie wystąpienia '$' w poniższym zbiorze ?

data = ['10,537.4', '$', '1,086.0', '$', '291.1', '$', '465.3', '$', '12,379.8']

Funkcja .index(element) znajduje tylko pierwsze wystąpienie.

result = data.index('$')

print(result) # 1

Na szczęście posiada ona drugi parametr .index(element, start), który pozwala określić pozycję, od której zacząć wyszukiwanie. Pozwala to stworzyć pętlę while, w której można zmieniać początkową pozycję wyszukiwania tak aby w kolejnej pętli pomijać poprzednio już znaleziony element.

data = ['10,537.4', '$', '1,086.0', '$', '291.1', '$', '465.3', '$', '12,379.8']

result = []
pos = 0 

while True:
    try:
        pos = data.index('$', pos)
    except ValueError:
        break

    result.append(pos)
    pos += 1 # zacznij jedno miejsce za ostatnio znalezionym

print(result)

Wersja z .index(element, start) wygląda skomplikowanie.

Za to weersja z pętlą for i enumerate() - ale już bez .index() - wygląda zdecydowanie prościej.

enumerate daje numer elementu oraz jego wartość więc można porównywać wartość ze wzorcem a numer elementu dodawać do listy wynikowej.

data = ['10,537.4', '$', '1,086.0', '$', '291.1', '$', '465.3', '$', '12,379.8']

result = []

for pos, value in enumerate(data)
    if value == '$':
        result.append(pos)

print(result)

To samo można zapisać krócej za pomocą wyrażenia listowego (list comprehension)

data = ['10,537.4', '$', '1,086.0', '$', '291.1', '$', '465.3', '$', '12,379.8']

result = [pos for pos, value in enumerate(data) if value == '$']

print(result)

Wyszukiwanie można też wykonać z użyciem NumPy.

numpy.where(warunek) zwraca numery elementów, które spełniają podany warunek. Ponieważ wynik jest jako tupla więc trzeba pobrać pierwszy element [0].

Na koniec za pomocą .tolist() można to zamienić na tradycyjną listę jeśli nie checemy mieć tego jako numpy.array.

import numpy as np

data = ['10,537.4', '$', '1,086.0', '$', '291.1', '$', '465.3', '$', '12,379.8']

arr = np.array(data)
result = np.where(arr == '$')[0]
result = result.tolist()

print(result)

Podobnie wyszukiwanie można wykonać z użyciem Pandas.

Po zamianie na DataFrame powstaje kolumna o numerze zero df[0], którą można porównać z szukanym elementem df[0] == '$' i wykorzystać to do odfiltrowania innych wierszy df[ df[0] == '$' ] Po takiej operacji .index podaje już tylko numery wierszy spełniających początkowy warunek.

Na koniec z pomocą .tolist() można to zamienić na tradycyjną listę jeśli nie checemy mieć tego jako pandas.Series.

import pandas as pd

data = ['10,537.4', '$', '1,086.0', '$', '291.1', '$', '465.3', '$', '12,379.8']

df = pd.DataFrame(data)
result = df[ df[0] == '$' ].index
result = result.tolist()

print(result)

Wszystkie przykłady zebrane razem na PasteBin: https://pastebin.com/WjbaxHTK

Dokumentacja:

Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury