Как говорит Тордек, вы можете использовать items()
или iteritems()
в этом случае, чтобы избежать проблемы:
colprint(sorted((name, packages[0].summary or '')
for (name, packages) in versions.items()))
Перемещение сортировки наружу - приятное прикосновение.
[Обратите внимание, что использование items()
немного изменило порядок сортировки - раньше это было по имени с связями, разрешенными в исходном порядке (сортировка Python стабильна), теперь это по имени со связями, разрешенными по сводке. Поскольку первоначальный порядок диктов является случайным, новое поведение, вероятно, лучше.]
Но для других целей (таких как пример Алекса Мартелли), аналог «let» может быть полезен.
Я также однажды обнаружил уловку for var in [value]
, но теперь я нахожу ее уродливой.
Более чистой альтернативой может быть «конвейер» пониманий / генераторов, использующий трюк «decorate / undecorate» для передачи добавленной стоимости в кортеж:
# You could write this with keys() or items() -
# I'm just trying to examplify the pipeline technique.
names_packages = ((name, versions[name][0])
for name in versions.keys())
names_summaries = ((name, package.summary or '')
for (name, package) in names_packages)
colprint(sorted(names_summaries))
Или применимо к примеру Алекса:
ys = (somefun(z) for z in zs)
xs = [(y, y*1.2, y-3.4) for y in ys]
(в котором вам даже не нужны исходные z
значения, поэтому промежуточные значения не обязательно должны быть кортежами.)
См. http://www.dabeaz.com/generators/ для более мощных примеров техники "конвейера" ...