#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)