2013-06-08 1 views
1

У меня есть большой список списков (импортированных из CSV) со строкой заголовка. Первые три строки, включая заголовок, выглядят так. В каждой строке есть намного больше элементов, но я урезал ее для удобства чтения.LIst из списков python - ссылки на конкретные местоположения/подсети для резки

[('Div', 'Date', 'HomeTeam', 'AwayTeam', 'FTHG', 'FTAG'), 
('E0', '18/08/12', 'Arsenal', 'Sunderland', '0', '0'), 
('E0', '18/08/12', 'Fulham', 'Norwich', '5', '0')... ] 

Это для статистики пакет хобби футбола, что у меня было/есть в первенствовать и хотел сделать на основе веб, так что я что-то реальное, чтобы работать на как я узнал питона. У меня есть ряд средних значений, которые я хочу рассчитать, поэтому хочу сопоставить домашнюю команду в каждой строке и добавить значение в любой столбец, который я выбрал для текущей суммы, чтобы я мог выработать среднее значение. На самом деле простые слова, каждый раз, когда домашняя команда соответствует «Челси», скажем, я хочу добавить ее в свою текущую общую сумму, чтобы рассчитать среднее количество голов, которые они забили дома. Файл данных очень согласован, поэтому я знаю, что определенные переменные всегда будут в столбце 4 или 5 или что угодно.

def CalcAverageHome(team, column, data_file): 
    total = 0 
    count = 0 
    for team in data: 
     if data[2] == team: 
      print data_file[4] 
     #total += data[4] 
     count += 1 
    else: 
     pass 
    average = total/5 
    return 
print "Here's the Average" 
print CalcAverageHome("Chelsea", 4, data) 

Когда я запускаю этот код, он дает мне четвертый список (список верхнего уровня), т.е.

('E0', '18/08/12', 'QPR', 'Swansea', '0', '5'... 

Я начал пытаться использовать itertools, но даже просто перебирая списки печатать как отладчик не работает (я хотел убедиться, что он работает, как я иду)

print "Let's try this with itertools" 
def chain(*iterables): 
    for it in iterables: 
    print it 
    for element in it: 
     yield element 
     print element 
chain(data) 

data является переменным, что данные из CSV были прочитаны в список, списков.

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

+0

Это довольно необычно для команды в данных: если данные [2] == team: ... 'как вы думаете, что это делает? где определяется «данные»? –

+0

Извините, данные определены ранее, я только что добавил, что в редактировании. Я хотел проверить, был ли элемент списка в столбце 2 файла данных той командой, в которой я в настоящее время смотрел. – Withnail

+0

ОК. Я предположил, что 'data_file' был списком списков. Что такое 'data_file'? –

ответ

0

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

data_file = [('Div', 'Date', 'HomeTeam', 'AwayTeam', 'FTHG', 'FTAG'), 
('E0', '18/08/12', 'Arsenal', 'Sunderland', '0', '0'), 
('E0', '18/08/12', 'Arsenal', 'Sunderland', '4', '0'), 
('E0', '18/08/12', 'Arsenal', 'Sunderland', '2', '0'), 
('E0', '18/08/12', 'Fulham', 'Norwich', '5', '0') ] 

def CalcAverageHome(team, column, data_file): 
    total = 0 
    n=0   # the number of times the team you are looking for is in the data 
    for row in data_file: 
     if row[2] == team: 
      total += int(row[column]) 
      n+=1 
    try: 
     average = float(total)/n # if u r using python 2.7.Else if 3.2+ just total/n 
    except ZeroDivisionError:  # to prevent zerodevisionerror if t team had n games 
     average = 'Not played' 
    return average 

Проблемы были

  • , который вы использовали команду для итерации по data_file, который также был параметр для рассчитайте function.So в проверке, если вы использовали внутри цикла for, вы не проверяли команду, введенную вами в функцию, но для строки в данных, которые вы повторили с помощью цикла for
+1

Зачем хранить явный 'count'? Вы не можете использовать 'row' вместо' data_file [count] '? –

+0

да, вы правы, я пытался сделать код, больше как @chris code.i сейчас редактирую его. – vaggelas

+0

Это замечательно (и имеет смысл, это было ссылкой на элемент строки, с которым у меня возникли проблемы) - один вопрос, хотя, кажется, он выводит его как округленное целое число, которое, как я знаю, неверно (я предполагаю, что фактическое число правильно, он просто округлен).У меня возникла проблема с вашим набором данных mock и моим - если я установил третий матч на «27», средний показатель 10, когда он должен быть 10.33, повторяющийся. – Withnail