Когда я писал для этой статьи, я наткнулся на заявление следующим образом:
Программирование – это искусство решения проблем в нескольких строках кода.
Ну, когда я начал писать программы, часто я осознавал, что они излишне длинные. Одна из причин, по которой лень и не следовать хорошим методам кодирования, что является интересной темой для другого дня. Другая часть заключается в том, что такие функции, как карта и фильтр, не так интуитивно понятны, как типичные для петли при использовании для обработки списка или элементов словаря. Однако они невероятно короткие! Вот пример:
# example data data = [ [0, ["bronze",] ] , [1,["gold","bronze"] ] , ... ] # long version filtered_data = [] for lst in data: if "gold" in lst[1]: filtered_data.append(lst) # short version, checks if the word "gold" is in a particular list filtered_data = list(filter(lambda x: "gold" in x[1], data)) # output # [ [1,["gold","bronze"]] , ...]
Баланс между читаемостью и краткой должна наблюдаться, когда мы думаем о сокращении длины кода, который мы пишем. В приведенном выше примере обе версии являются достоверными решениями, и первая ближе к тому, как я воспринимаю решение. Тем не менее, изучение того, как использовать фильтр, а также функции Lambda невероятно мощный и может сэкономить вам много места.
Есть несколько мест, где мы можем легко применить фильтр/карту:
- Когда мы имеем дело с списком/кортежом списков/словарей/кортежей, в основном коллекцией коллекций
- Когда нам нужно переходить через каждый элемент в коллекции и определять, оставаться или отбрасывать ( filter )
- Когда нам нужно перевернуть каждый элемент в коллекции и вносить прямые изменения в элемент ( map )
Вы должны помнить, чтобы применить преобразование типа, как правило, перечислять или кортежон в объект фильтра/карты, чтобы снова преобразовать их в коллекцию.
>>> l = [2,3,4] >>> a = filter(lambda x:x==2,l) >>> a>>> list(a) [2]
Предположим, что у вас есть файл CSV (разделенные запятыми) данных фильма в IMDB.CSV, где каждая запись содержит следующую информацию:
- Имя директора
- Жанр: он содержит список жанров, разделенных |
- Имя актера
- Название фильма
- IMDB Рейтинг
- Год выпуска
Вот так
director_name,genre,actor_name,movie_name,rating,year Andrew Berends,Documentary|War,,The Blood of My Brother,3.5,2005 U. Roberto Romano,Documentary,,The Harvest/La Cosecha,4.6,2011 Amal Al-Agroobi,Documentary|Family,,The Brain That Sings,3.5,2013 Jem Cohen,Documentary,,Counting,3.1,2015
Теперь, если вы внимательно наблюдали, между запятыми есть пустые пространства, сигнализируя об отсутствии данных для определенных столбцов в приведенных выше данных образцах.
Вот некоторые задачи очистки данных, которые могут потребоваться для нас выполнения:
- Удаление записей, которые не соответствуют спецификациям. В этом примере IMDB оценивает фильм по шкале 0-10 (включительно), мы не будем доверять каким-либо рейтингу, который находится вне этих границ.
- Данные должны быть завершены. Ни одна из полей, то есть (i) режиссер, (ii) жанр, (iii) актер, (iv) фильм, (v) рейтинг и (iv) год выпуска должен быть пустым.
- Данные состоит из фильмов, выпущенных между 1990 и 2019 годами. Если запись фильма выпущена за пределы этого периода времени, она считается ненадежным.
Давайте скажем, мы хотим очистить данные и вернуть список имен фильмов, которые имеют рейтинг выше или равны 9. Вот как мы подходим к вопросу и используем фильтр/карту по пути.
Это фрагмент функции вспомогательной обработки CSV в Python:
import csv def read_csv(filename): with open(filename, 'r') as f: # reads csv into a list of lists lines = csv.reader(f, delimiter=',') return list(lines)[1:] # removes the header row # removes the header
Оба фильтр / карта Функция принимает два параметра, функция (может быть нормальной функцией или функцией Lambda) и коллекции (список/кортеж и т. Д.), На которой вы хотите поработать. Возвращает объект фильтра/карты. См. Комментарии для объяснения использования.
def clean_data(filename): # Process csv into python readable format data = read_csv(filename) # Check that none of the column is empty data = list(filter(lambda x: x[0]!="" and x[1]!="" and x[2]!="" and x[3]!="" and x[4]!="" and x[5]!="", data)) # another way using a second filter # data = list(filter(lambda x: len(list(filter(lambda y:y!="",x)))==6,data)) # Check that movie is within timespan data = list(filter(lambda x: 1990<= int(x[5])<=2019, data)) # Check that movie rating is within range data = list(filter(lambda x: 0<=float(x[4])<=10, data)) # Check that movie rating is higher than 9 data = list(filter(lambda x: float(x[4])>=9, data)) # Returns only a list of movie names return list(map(lambda x:x[3], data))
- Обратите внимание, что данные из CSV имеют тип строки, и, следовательно, для сравнения числа требуется преобразование типа.
- В применении нескольких функций фильтра и/или карты нет остановки, если они не смущают вас (как сейчас, так и будущее вас).
Вот и все. Надеемся, что этот простой пример показал вам, как использовать фильтр по умолчанию и функцию карты в Python. Счастливого обучения.
Оригинал: “https://dev.to/tlylt/filter-map-and-manipulating-csv-data-in-python-fnn”