2012-04-25 43 views
10

首先请原谅我有点不好的标题。我不太确定该怎么说。如果有人可以建议一个更好的标题,那就太棒了。Python列表理解拆分循环变量

我想知道是否有办法将列表理解的每个迭代的值分割一次,但在输出中使用它两次。我试图解决这个问题的一个例子是:

我有串

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 2012-04-25 04:06:29