2012-04-25 4 views
10

Сначала, пожалуйста, простите меня за несколько плохой титул. Я не был уверен, как это сказать. Если бы кто-то мог предложить лучший титул, это было бы здорово.Python List Comprehensions Переменная цикла разделения

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

У меня есть строка

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')] 

Без необходимости работает разделить три раза , Так что-то вроде этого (что, очевидно, недопустимый синтаксис, но, надеюсь, достаточно, чтобы получить сообщение через):

[(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, чтобы дать ему вход.

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

заранее спасибо :)

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

ответ

16

Вы можете использовать список понимание обернутого вокруг выражения генератора:

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

спасибо очень круто :) – Nick

Смежные вопросы