У меня есть куча списочных представлений, которые я хотел бы объединить.
У меня есть список объектов, и я хочу создать набор списков, каждый из которых содержит некоторое свойство каждого из объектов в исходном списке. Например:
my_list = ["Kathryn", "John", "Eve", "Jack"]
initials = [x[0] for x in my_list]
upper_case = [x.upper() for x in my_list]
lower_case = [x.lower() for x in my_list]
Обратите внимание, что я перебираю свой первоначальный список несколько раз. Если у меня есть много разных свойств, которые я хочу получить от каждого элемента, то я буду многократно повторять этот цикл.
Вместо этого я попытался сжать результаты получения всех свойств за одну итерацию:
initials, upper_case, lower_case = zip(*((x[0], x.upper(), x.lower()) for x in my_list))
Это работает, за исключением того, что (1) я думаю, что этот код довольно неясен, и (2) результирующие переменные на самом деле являются кортежами, а не списками, поэтому для получения списков (которые мне нужны) мне нужно сделать что-то вроде
initials, upper_case, lower_case = (list(x) for x in (initials, upper_case, lower_case))
что, уже сейчас, но особенно если я извлекаю более трех свойств, мне тоже не очень нравится внешний вид. («... из которых мне тоже не очень нравится внешность»?)
Есть ли более удовлетворительный, "чище" способ сделать это?