对列表中的项进行有条件迭代的Python方法

对列表中的项进行有条件迭代的Python方法,python,lxml,Python,Lxml,一般来说,我是编程新手,所以我可能用错误的方法来处理这个问题。我正在编写一个lxml解析器,其中我想从解析器输出中省略没有内容的HTML表行。这就是我得到的: for row in doc.cssselect('tr'): for cell in row.cssselect('td'): sys.stdout.write(cell.text_content() + '\t') sys.stdout.write '\n' write()内容是临时的。我希望循环只返

一般来说,我是编程新手,所以我可能用错误的方法来处理这个问题。我正在编写一个lxml解析器,其中我想从解析器输出中省略没有内容的HTML表行。这就是我得到的:

for row in doc.cssselect('tr'):
    for cell in row.cssselect('td'):
        sys.stdout.write(cell.text_content() + '\t')
    sys.stdout.write '\n'
write()
内容是临时的。我希望循环只返回
tr.text\u content!=''的行。所以我想我是在问如何写我的大脑认为应该是‘如果a!’但那不行


谢谢

重新编辑:

你知道,我真的一点都不喜欢我的答案。我对另一个答案投了赞成票,但我喜欢他最初的答案,因为它不仅简洁明了,而且不言自明,而且没有“花哨”,这正是我的受害者:

for row in doc.cssselect('tr'):
    for cell in row.cssselect('td'):
        if(cel.text_content() != ''):
            #do stuff here
没有比这更优雅的解决方案了

原始ish

您可以按如下方式变换第二个
for
循环:

[cell for cell in row.cssselect if cell.text_content() != '']
把它变成一个列表。这样你就有了一个预先筛选的列表。通过查看以下示例,您可以进一步了解这一点:

a = [[1,2],[2,3],[3,4]
newList = [y for x in a for y in x]
将其转换为
[1,2,2,3,3,4]
。然后,您可以在末尾添加
if
语句以筛选出值。因此,您可以将其简化为一行

再次,如果你看到:

生成一个迭代器,您可以对其进行迭代,跳过所有不需要的项

编辑

在我得到更多的反对票之前,如果您使用的是python 3.0,
filter
的工作方式也是一样的。无需导入
ifilter

for row in doc.cssselect('tr'):
    cells = [ cell.text_content() for cell in row.cssselect('td') ]
    if any(cells):
        sys.stdout.write('\t'.join(cells) + '\n')

仅当至少有一个单元格包含文本内容时才打印行。

嗯,您到底想做什么?解析xml一点也不简单。也许你应该试试别的,因为你才刚刚开始?你给我们看一些输入/输出的例子怎么样?这就是我遇到的问题。稍微重新措辞的问题来澄清。沃瑟斯,给我一秒钟来编辑我的帖子!很高兴大家这么快就画出来了。谢谢,这已经接近我所需要的了。唯一的问题是,它没有正确地对齐东西,因为它掉了所有的空单元格。因此,一行可以有1个非空单元格,另2个非空单元格,并且将有一个非表格对齐方式。@troutinator-我已经编辑了答案,现在它打印全部或全部不打印。
for row in doc.cssselect('tr'):
    cells = [ cell.text_content() for cell in row.cssselect('td') ]
    if any(cells):
        sys.stdout.write('\t'.join(cells) + '\n')