Создание сложного списка понимания условно - PullRequest
0 голосов
/ 15 февраля 2019

Вот мой текущий однострочный:

leader = [server.get_member(x) for x in self.rosters[server.id][clan]['members'] if discord.utils.get(server.get_member(x).roles, id="463226598351699968")]

Я хочу запустить это, только если server.get_member(x) не False.Как я могу добавить эту дополнительную логику в это понимание списка?Я понимаю, как сделать простое for in утверждение, но его вложение глубже, чем это, немного сбивает с толку.

Ответы [ 4 ]

0 голосов
/ 15 февраля 2019

В общем, вы можете добиться эффекта временного присваивания переменной с помощью понимания вложенного списка, который перебирает 1-кортеж:

leader = [m for x in self.rosters[server.id][clan]['members'] for m in (server.get_member(x),) if m and discord.utils.get(m.roles, id="463226598351699968")]

Но в данном конкретном случае, как указал @ OlivierMelançon вкомментарий, так как дополнительное назначение просто отображает значение в вызове функции, вы можете достичь желаемого результата с помощью функции map:

leader = [m for m in map(server.get_member, self.rosters[server.id][clan]['members']) if m and discord.utils.get(m.roles, id="463226598351699968")]
0 голосов
/ 15 февраля 2019

Как правило, не жертвует удобочитаемостью ради написания однострочного .Если сразу неясно, как это сделать со списком, используйте цикл for.

leader = []

for x in self.rosters[server.id][clan]['members']:
    member = server.get_member(x)
    if member and discord.utils.get(member.roles, id="463226598351699968"):
        leader.append(member)

Хотя, в данном конкретном случае, поскольку вам не нужен x, вы можете использоватьmap для применения server.get_member во время итерации.

leader = [m for m in map(server.get_member, self.rosters[server.id][clan]['members'])
          if m and discord.utils.get(m.roles, id="463226598351699968")]
0 голосов
/ 15 февраля 2019

Вы не можете.Элемент в понимании списка не может быть сохранен, поэтому вам придется оценить его дважды.Даже если бы вы могли, не .Компоненты списка предназначены для фильтрации, а не для запуска кода в качестве побочного эффекта.Он нечитабелен и подвержен ошибкам.

0 голосов
/ 15 февраля 2019

Хотя я согласен с комментариями о том, что вы не должны писать это как понимание для удобства чтения, вы можете попробовать:

leader = [server.get_member(x) for x in self.rosters[server.id][clan]['members'] if discord.utils.get(server.get_member(x).roles, id="463226598351699968") if server.get_member(x)]

Похоже на этот ответ.

...