如何在不存储临时数组的情况下对数组切片使用strip()

时间:2014-03-12 05:38:30

标签: python

我的数据看起来像这样:

Probes  FOO BAR
1452463_x_at    306.564     185.705
1439374_x_at    393.742     330.495
1426392_a_at    269.850     209.931
1433432_x_at    636.145     487.012

在第二列中,它包含选项卡后的空格。

import sys
import csv
import pprint
with open('tmp.txt') as tsvfile:
   tabreader = csv.reader(tsvfile,delimiter="\t");
   for row in tabreader:
       #val = s.strip() for s in [row[1:3]]
       val = row[1:3]
       print val

以下是打印此内容的代码:

['FOO', 'BAR']
['306.564 ', '185.705']
['393.742 ', '330.495']
['269.850 ', '209.931']
['636.145 ', '487.012']

现在我要做的是在迭代行中时动态去除空白区域, 不将值存储在临时数组中。 特别是这条线:

 #val = s.strip() for s in [row[1:3]]

但为什么失败了?有什么办法呢

2 个答案:

答案 0 :(得分:1)

你的语法错了。你想要一个列表理解:

val = [s.strip() for s in row[1:3]]

现在,我不确定你想要什么,但我已经创建了一个新列表。这方面没有干净的 1 方式。

1 您可以使用显式循环并在将值重新分配到原始列表时去除值,但是...... Yuck ...


如果你真的想,你可以这样改变行:

row[:] = [s.strip() for s in row[1:3]]

但我不完全确定你会在这里获得什么优势。

答案 1 :(得分:1)

python中有generator expressions的概念。这是一个懒惰评估的list-comprehension版本,它不会立即创建结果列表。但是,普通的print不会导致生成器进行评估,因此您需要在打印之前将其转换为列表。

因此,使用您的代码应该看起来像(注意圆括号

for row in tabreader:
   val = (s.strip() for s in row[1:3])
   print list(val)

在您的示例中,使用生成器表达式并不比列表理解有任何优势,因为您要立即打印结果。如果你需要在巨大的列表上做一些额外的处理,减少内存占用,因为生成器表达式不会分配保存结果所需的内存,这可能非常方便。

用两个词来说:list-comprehension就像range一样(分配列表并立即用数据填充),生成器表达式就像xrange一样(按需生成下一个项目)