Переменная цикла, разделяющая понимание списка

Я пытаюсь выяснить, есть ли способ разделить значение каждой итерации понимания списка только один раз, но использовать его дважды в выводе.

В качестве примера проблемы, которую я пытаюсь решить, у меня есть строка:

a = "1;2;4\n3;4;5"

И я хотел бы выполнить это:

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

Без необходимости трижды запускать split. Итак, что-то вроде этого (Что, очевидно, является недопустимым синтаксисом, но, надеюсь, достаточно, чтобы передать сообщение):

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

В этом вопросе я не ищу причудливые способы получить 2-й и 3-й столбец строки. Это просто способ привести конкретный пример. Я мог бы, конечно, для примера использовать:

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

Возможные решения, о которых я подумал:

  1. Не использовать понимание списка
  2. Оставить как есть
  3. Использовать csv.DictReader, назвать мои столбцы и что-то вроде StringIO, чтобы дать ему ввод.

Это в основном то, что было бы хорошим шаблоном для использования, а не конкретным случаем, поэтому трудно ответить на вопросы типа «почему вы хотите это сделать» или «для чего это нужно»

Обновление:Прочитав приведенное ниже решение, я провел несколько тестов скорости. И я обнаружил в своих самых простых тестах, что предоставленное решение было на 35% быстрее, чем наивное решение выше.

15
задан Xavier Guihot 27 April 2019 в 15:40
поделиться