我的数据看起来像这样:
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]]
但为什么失败了?有什么办法呢
答案 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
一样(按需生成下一个项目)