Как правильно работать со списком списков в python? Конкретно со списком функций

1

Я пытаюсь grep некоторые страницы результатов для работы, а затем в конечном итоге распечатать их на веб-сайт html, поэтому кому-то не нужно вручную просматривать каждый раздел.

Как я в конечном итоге буду использовать: я подаю эту функцию на страницу результатов, она проходит через 5 различных разделов, затем я могу сделать вывод html (для чего предназначена эта область для печати) со всеми различными результатами.

OK MASSIVE EDIT Я действительно удалил старый код, потому что задавал слишком много вопросов. Я исправил свой код, принимая некоторые предложения, но меня все еще интересует преимущество использования читаемого человеком dict вместо простого списка. Вот мой рабочий код, который получает все правильные результаты в "список списков", затем я вывел первый раздел в моем возможном html-блоке

import urllib
import re
import string
import sys

def ipv6_results(input_page):
sections = ['/spec.p2/summary.html', '/nd.p2/summary.html',
            '/addr.p2/summary.html', '/pmtu.p2/summary.html', 
            '/icmp.p2/summary.html']
variables_output=[]                                                    
for s in sections:
    temp_list = []
    page = input_page + s
    #print page
    url_reference = urllib.urlopen(page)
    html_page = url_reference.read()
    m = re.search(r'TOTAL</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
    temp_list.append(int(m.group(1)) )
    m = re.search(r'PASS</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
    temp_list.append(int(m.group(1)))
    m = re.search(r'FAIL</FONT></B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
    temp_list.append(int(m.group(1)))
    variables_output.append(temp_list)

#print variables to check them :)
print "------"
print variables_output


print "Ready Logo Phase 2"
print "Section                 | Total | Pass | Fail |"
#this next part is eventually going to output an html block
output =  string.Template("""
1 - RFC2460-IPv6 Specs $spec_total $spec_pass $spec_fail
""")
print output.substitute(spec_total=variables_output[0][0], spec_pass=variables_output[0][1],
                        spec_fail=variables_output[0][2])


return 1

представьте себе, что табуляция верна :( Я бы хотел, чтобы это было больше похоже на пачку bin, предложения приветствуются при вставке кода здесь

Теги:
list
variables

3 ответа

3
Лучший ответ

Как правило, вы сначала не объявляете форму списка, а затем заполняете значения. Вместо этого вы создаете список, когда обнаруживаете значения.

Ваши variables имеют много структуры. У вас есть внутренние списки из 3 элементов, всегда в порядке "total", "pass", "fail". Возможно, эти 3-кортежи должны быть сделаны именованными. Таким образом, вы можете получить доступ к трем частям с человекозахвачиваемыми именами (data.total, data.pass, data.fail) вместо криптографических индексов (data[0], data[1], data[2]).

Затем ваши 3-кортежи отличаются префиксами: 'spec', 'nd', 'addr' и т.д. Они звучат как ключи к dict, а не элементы списка.

Поэтому, возможно, подумайте о том, чтобы сделать variables dict. Таким образом, вы можете получить доступ к определенному 3-кортежу, который вы хотите, с помощью распознаваемых человеком variables['nd'] вместо variables[1]. И вы можете получить доступ к значению nd_fail с помощью variables['nd'].fail вместо variables[1][2]:

import collections
# define the namedtuple class Point (used below).
Point = collections.namedtuple('Point', 'total pass fail')

# Notice we declare 'variables' empty at first; we'll fill in the values later.
variables={}
keys=('spec','nd','addr','pmtu','icmp')
for s in sections:
    for key in keys:
        page = input_page + s
        url_reference = urllib.urlopen(page)
        html_page = url_reference.read()
        m = re.search(r'TOTAL</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
        ntotal = int(m.group(1)) 
        m = re.search(r'PASS</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
        npass = int(m.group(1))
        m = re.search(r'FAIL</FONT></B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
        nfail = int(m.group(1))

        # We create an instance of the namedtuple on the right-hand side
        # and store the value in 'variables[key]', thus building the 
        # variables dict incrementally.
        variables[key]=Point(ntotal,npass,nfail)
  • 0
    это хороший момент для изучения ... 2 проблемы, хотя, очевидно, pass является зарезервированным словом в python :), и это все еще не решает проблему, где у меня был тот же результат для spec / nd / addr / pmtu / icmp. Я переписывал это ... хотя я исправил это, используя другой метод, ваш способ более удобен для восприятия человеком, я хочу опубликовать и посмотреть, могут ли люди помочь мне изучить «путь питона», а не мой » очень машина c way 'хаха спасибо за совет, учусь каждый день
  • 0
    редактировать добавлено выше
0

Я бы использовал словарь в списке. Может быть, что-то вроде:

def ipv6_results(input_page):
    results = [{file_name:'/spec.p2/summary.html', total:0, pass:0, fail:0},
               {file_name:'/nd.p2/summary.html', total:0, pass:0, fail:0},       
               {file_name:'/addr.p2/summary.html', total:0, pass:0, fail:0},
               {file_name:'/pmtu.p2/summary.html', total:0, pass:0, fail:0},
               {file_name:'/icmp.p2/summary.html', total:0, pass:0, fail:0}] 
    for r in results:
        url_reference = urllib.urlopen(input_page + r[file_name])
        html_page = url_reference.read()
        m = re.search(r'TOTAL</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
        r[total] = int(m.group(1))
        m = re.search(r'PASS</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
        r[pass] = int(m.group(1))
        m = re.search(r'FAIL</FONT></B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
        r[fail] = int(m.group(1))

    for r in results:
        print r[total]
        print r[pass]
        print r[fail]
0

Во-первых, эти списки будут только значениями переменных во время присвоения. Вы изменили бы значение списка, но не переменные.

Я бы серьезно подумал о том, чтобы использовать классы и строить структуры из них, включая списки экземпляров классов.

Например:

class SectionResult:
  def __init__(self, total = 0, pass = 0, fail = 0):
    self.total = total
    self.pass = pass
    self.fail = fail

Поскольку похоже, что каждая группа должна связываться с разделом, вы можете создать список словарей (или, возможно, список классов?) С битами, связанными с разделом:

sections = [{'results' : SectionResult(), 'filename': '/addr.p2/summary.html'}, ....]

Затем в цикле:

for section in sections:
   page = input_page + section['filename']
   url_reference = urllib.urlopen(page)
   html_page = url_reference.read()
   m = re.search(r'TOTAL</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
   section['results'].total = int(m.group(1)) 
   m = re.search(r'PASS</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
   section['results'].pass = int(m.group(1))
   m = re.search(r'FAIL</FONT></B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
   section['results'].fail = int(m.group(1))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню