#python #json #pandas #list-comprehension #set-comprehension
#python #json #pandas #понимание списка #set-понимание
Вопрос:
Приведенный ниже код взят из главы 3 Руководства по Python Data Science Джейка Вандерпласа. Каждая строка в файле является допустимым JSON. Хотя я не думаю, что специфика файла имеет решающее значение для ответа на этот вопрос, URL-адрес файла https://github.com/fictivekin/openrecipes .
# read the entire file into a Python array
with open('recipeitems-latest.json', 'r') as f:
# Extract each line
data = (line.strip() for line in f)
# Reformat so each line is the element of a list
data_json = "[{0}]".format(','.join(data))
# read the result as a JSON
recipes = pd.read_json(data_json)
Два вопроса:
- почему во второй строке кода используется понимание генератора, а не понимание списка? Поскольку желаемая конечная структура данных представляет собой список, мне интересно, почему бы не работать только со списками, а не работать сначала с генератором, а затем со списком?
- можно ли вместо этого использовать понимание списка?
Комментарии:
1. Ответ на 2 — да, но это дает хорошее описание, почему он не может его использовать. Вы также можете использовать другие статьи Google geeksforgeeks.org /…
Ответ №1:
Здесь у вас есть два вопроса:
- Почему generator comp? Потому что вы не знаете размер JSON заранее. Так что лучше перестраховаться и не загружать весь файл в память.
- Да, можно использовать понимание списка. Просто замените круглые скобки квадратными скобками.
>>> f = open('things_which_i_should_know')
>>> data = (line.strip() for line in f)
>>> type(data)
<class 'generator'>
>>> data = [line.strip() for line in f]
>>> type(data)
<class 'list'>
>>>
Пожалуйста, смотрите Официальную документацию для получения дополнительной информации.
При понимании списка вы получаете список Python; stripped_list — это список, содержащий результирующие строки, а не итератор. Выражения генератора возвращают итератор, который вычисляет значения по мере необходимости, не требуя материализации всех значений сразу. Это означает, что понимание списка бесполезно, если вы работаете с итераторами, которые возвращают бесконечный поток или очень большой объем данных. Выражения генератора предпочтительнее в этих ситуациях.