Pythonic способ условно перебирать элементы в списке - PullRequest
3 голосов
/ 03 февраля 2011

В общем, новичок в программировании, так что я, вероятно, ошибаюсь.Я пишу синтаксический анализатор 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_content != ''.Поэтому я думаю, что спрашиваю, как написать то, что мой мозг считает «для a в b, если a! = X», но это не сработает.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 03 февраля 2011
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')

печатает строку, только если есть хотя бы одна ячейка с текстовым содержимым.

0 голосов
/ 03 февраля 2011

Пересоздать

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

for row in doc.cssselect('tr'):
    for cell in row.cssselect('td'):
        if(cel.text_content() != ''):
            #do stuff here

элегантного решения не намного больше.

Original-иш :

Вы можете преобразовать второй цикл 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 для вывода значений. Следовательно, вы бы сократили это в одну строку.

Опять же, если вы посмотрите на itertools :

ifilter(lambda x: x.text_content() != '', row.cssselect('td'))

создает итератор, который вы можете перебирать, пропуская все ненужные элементы.

Редактировать

И прежде чем я получу больше отрицательных голосов, если вы используете Python 3.0, filter работает так же. Нет необходимости импортировать ifilter.

...