2013-06-14 5 views
0

Я хочу реализовать следующий код в большей степени вещий образом:Pythonic способ перебрать петли

odd_rows = table.findAll('tr', attrs = {'class':'odd'}) #contain all tr tags 
even_rows = table.findAll('tr', attrs = {'class':'even'}) 

for rows in odd_rows:    #rows equal 1 <tr> tag 
    rows.findAll('td')    #find all the <td> tags located in that one <tr> tag 
    for row in rows.findAll('td'): #find one <td> tag 
     print row     #print that <td> tag 

for rows in even_rows: 
    rows.findAll('td') 
    for row in rows.findAll('td'): 
     print row 

линия row.findAll('td') показывает моя логика

+0

[codereview.se] – Doorknob

+2

Строка 'rows.findAll ('td')' сама по себе ничего не делает –

+2

Когда вы выполняете 'rows.findAll ('td')' операция выполняется. Когда вы делаете 'для строки в rows.findAll ('td'):' операция выполняется AGAIN. Первое - лишнее. – That1Guy

ответ

2

Возможно:

for row in table.findAll('tr', attrs = {'class':'odd'}) + table.findAll('tr', attrs = {'class':'even'}): 
    for cell in row.findAll('td'): 
     print cell 

С точки зрения производительности ваш исходный код лучше. Сочетание двух списков использует ресурсы.

Однако, если вы не пишете код для шкалы Google, я согласен с этой цитатой.

Программы должны быть написаны для людей, чтобы читать, и только случайно для машин для выполнения.
- Hal Абельсон, Структура и интерпретация компьютерных программ

Существует более чем один способ сделать это. Напишите код, который вы считаете наиболее читаемым для вас. Компьютер может определить детали.

+0

Не могли бы вы объяснить, что делает «+»? поэтому, если бы у меня было 3 типа классов, мне нужно было бы добавить 3 'table.findAll()'? –

+1

@JamesHallen 'table.findAll' возвращает список, поэтому' table.findAll (...) + table.findAll (...) 'объединяет два списка, не что иное, как делать [[1, 2] + [ 3, 4] ' –

3
for cls in ("odd", "even"): 
    for rows in table.findAll('tr', class_=cls): 
     for row in rows.findAll('td'): 
      print row 
+0

@Blender: спасибо за предложение –

+0

Если вам не нужен заказ, передайте кортеж классов классу 'class_', и он будет соответствовать элементам, имеющим любой из них. – Blender

+0

Должна ли вторая строка 'table.find_all' или' table.findAll'? –

Смежные вопросы