Чтение строк из файла с использованием понимания генератора против понимания списка

#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. можно ли вместо этого использовать понимание списка?

Комментарии:

1. Ответ на 2 — да, но это дает хорошее описание, почему он не может его использовать. Вы также можете использовать другие статьи Google geeksforgeeks.org /…

Ответ №1:

Здесь у вас есть два вопроса:

  1. Почему generator comp? Потому что вы не знаете размер JSON заранее. Так что лучше перестраховаться и не загружать весь файл в память.
  2. Да, можно использовать понимание списка. Просто замените круглые скобки квадратными скобками.
 >>> 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 — это список, содержащий результирующие строки, а не итератор. Выражения генератора возвращают итератор, который вычисляет значения по мере необходимости, не требуя материализации всех значений сразу. Это означает, что понимание списка бесполезно, если вы работаете с итераторами, которые возвращают бесконечный поток или очень большой объем данных. Выражения генератора предпочтительнее в этих ситуациях.