Нужна помощь в понимании цикла

#python #loops #for-loop

Вопрос:

может ли кто-нибудь помочь мне с логикой, лежащей в основе приведенного ниже кода

предполагая, что mpg — это список словарей

 cylinders = set(d['cyl'] for d in mpg)
 

Я написал этот код, но мне нужна помощь, чтобы обобщить его в одной строке

 cylinders=list()
for d in mpg :
    cylinders.append(d['cyl'])

new_cylinders=set(cylinders)
 

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

1. Я не совсем понимаю, о чем ты спрашиваешь. Эти два фрагмента делают одно и то же. Для каждого словаря в mpg нем добавляется значение 'cyl' ключа в этот список/набор.

2. Первая строка кода эквивалентна второму блоку кода и, следовательно, суммирует его в одной строке. Второй блок кода эквивалентен первому и, следовательно, выражает логику первого в более широких терминах.

3. Я не понимаю, в чем ваша проблема.

Ответ №1:

Проясняет ли это пример?

 mpg = [ {'make':'Ford','cyl':12}, {'make':'Toyota','cyl':9}, {'make':'Rolls Royce','cyl':16} ]
 

После вашей функции вы должны были бы:

 new_cylinders = {12, 9, 16}
 

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

1. Привет @TimRoberts , Спасибо за ваш ответ, я знаю, как выглядит вывод, но что меня смущает, так это то, что функция no .add() включена и как она сохраняет запись предыдущих d[‘cyl’] . Я также попытался напечатать все *d[‘cyl’]*таким образом(одна строка для цикла), но он отправил трассировку, не могли бы вы показать мне, как это сделать, если это возможно?

2. В цикле «для», который у вас есть выше , если вы замените cylinders.append строку на print( d["cyl"] ) , я гарантирую, что она будет работать.

3. Я имел в виду , как внести изменения cylinders = set(d['cyl'] for d in mpg) , извините, если я не смог правильно передать свою цель.

4. Учитывая набор, вы можете это сделать print( ', '.join(str(c) for c in cylinders) ) .

Ответ №2:

То, что находится внутри set(...) , называется генераторным выражением. Когда они встречаются «голыми», они должны быть заключены в круглые скобки, но когда они встречаются как единственный параметр вызова функции, круглые скобки могут быть опущены.

Выражение генератора возвращает генератор, который по требованию будет выдавать последовательность значений. В этом случае set() функция выполнит требуемое и построит набор результатов. (Таким образом , причина, по которой вам не нужна явная .add , заключается в том, что вы предоставляете последовательность значений для построения набора.)

(Я думаю, вы также могли бы использовать набор отображения и записи cylinders = {d['cyl'] for d in mpg} )

Итак, как вы печатаете вещи внутри выражения генератора? Ну, то, что было раньше for , должно быть одним выражением; чем-то, что генерирует ровно одно значение. Вы могли бы сделать это с помощью вспомогательной функции:

 def print_and_return(x):
    print(x)
    return x

cyls = set(print_and_return(d['cyl']) for d in mpg)