Я пытаюсь выяснить, есть ли способ разделить значение каждой итерации понимания списка только один раз, но использовать его дважды в выводе.
В качестве примера проблемы, которую я пытаюсь решить, у меня есть строка:
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")]
Возможные решения, о которых я подумал:
csv.DictReader
, назвать мои столбцы и что-то вроде StringIO
, чтобы дать ему ввод.Это в основном то, что было бы хорошим шаблоном для использования, а не конкретным случаем, поэтому трудно ответить на вопросы типа «почему вы хотите это сделать» или «для чего это нужно»
Обновление:Прочитав приведенное ниже решение, я провел несколько тестов скорости. И я обнаружил в своих самых простых тестах, что предоставленное решение было на 35% быстрее, чем наивное решение выше.