Variedade de loop de divisão de compreensões de lista

Primeiro, por favor, perdoe-me pelo título um tanto ruim. Eu não sabia bem como dizer isso. Se alguém pudesse sugerir um título melhor, seria ótimo.

Eu estou tentando descobrir se há uma maneira de dividir o valor de cada iteração de uma compreensão de lista apenas uma vez, mas usá-lo duas vezes na saída. Um exemplo do problema que estou tentando resolver é:

Eu tenho a string

<code>a = "1;2;4\n3;4;5"
</code>

E eu gostaria de realizar isso:

<code>>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
</code>

Sem a necessidade de executar o split três vezes. Então, algo assim (que é obviamente uma sintaxe inválida, mas esperamos que seja o suficiente para passar a mensagem):

<code>[(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5]
</code>

Nesta pergunta eu sounão procurando formas extravagantes para obter a segunda e terceira coluna da string. É apenas uma maneira de fornecer um exemplo concreto. Eu poderia, claro, para o uso de exemplo:

<code>[x.split(";")[1:3] for x in a.split("\n")]
</code>

As possíveis soluções em que pensei:

Não use uma compreensão de listaDeixe como estáUse ocsv.DictReader, nomeie minhas colunas e algo parecidoStringIO para dar a entrada.

Isso é principalmente algo que seria um bom padrão para ser usado em vez de um caso específico, então é difícil responder ao tipo de perguntas "por que você quer fazer isso" ou "o que é isso para"?

Atualizar: Depois de ler a solução abaixo, fiz alguns testes de velocidade. E descobri em meus testes básicos que a solução fornecida era 35% mais rápida do que a solução ingênua acima.

questionAnswers(1)

yourAnswerToTheQuestion