2017-09-05 21 views
1

私はハッカーのランクを使って少しの宿題をしていますが、なぜ私の答えを受け入れないのか分かりません。CSVの解析とデータの分析

Here is the link to the original repository.

目標は、その目標や価値観可目標との差が最も小さいチームの名前を印刷することです。

LeicesterとAston_Villaの2つの可能性があるようです。レスターは得点と目標の間にマイナスの差があるため(-37)、Aston_Villaの絶対差は最小です(-1)。しかしどちらも受け入れられません。

なぜですか?

import sys 
import os 
import csv 

text = '''Team,Games,Wins,Losses,Draws,Goals,Goals Allowed,Points 
Arsenal,38,26,9,3,79,36,87 
Liverpool,38,24,8,6,67,30,80 
Manchester United,38,24,5,9,87,45,77 
Newcastle,38,21,8,9,74,52,71 
Leeds,38,18,12,8,53,37,66 
Chelsea,38,17,13,8,66,38,64 
West_Ham,38,15,8,15,48,57,53 
Aston_Villa,38,12,14,12,46,47,50 
Tottenham,38,14,8,16,49,53,50 
Blackburn,38,12,10,16,55,51,46 
Southampton,38,12,9,17,46,54,45 
Middlesbrough,38,12,9,17,35,47,45 
Fulham,38,10,14,14,36,44,44 
Charlton,38,10,14,14,38,49,44 
Everton,38,11,10,17,45,57,43 
Bolton,38,9,13,16,44,62,40 
Sunderland,38,10,10,18,29,51,40 
Ipswich,38,9,9,20,41,64,36 
Derby,38,8,6,24,33,63,30 
Leicester,38,5,13,20,30,64,28''' 

with open('football.csv', 'w') as f: 
    f.write(text) 



def read_data(filename): 
    """Returns a list of lists representing the rows of the csv file data. 

    Arguments: filename is the name of a csv file (as a string) 
    Returns: list of lists of strings, where every line is split into a list of values. 
     ex: ['Arsenal', 38, 26, 9, 3, 79, 36, 87] 
    """ 
    ifile = open('football.csv', 'rt') 
    reader = csv.reader(ifile) 

    listed = [] 
    for row in reader: 
     print(row) 
     listed.append(row) 

    return listed 

data = read_data('football.csv') 

def get_index_with_min_abs_score_difference(goals): 
    net_goals = [] 

    for i in goals[1:]: 
     net_goals.append(int(i[5]) - int(i[6])) 

    return net_goals.index(min(net_goals))+1 

def get_team(index_value, parsed_data): 
    return parsed_data[index_value][0] 

footballTable = read_data('football.csv') 
minRow = get_index_with_min_abs_score_difference(footballTable) 
print(str(get_team(minRow, footballTable))) 

また、別の解決策(つまり、得点と目標の差が最も小さいチーム)を試しました。

def get_index_with_min_abs_score_difference(goals): 
    """Returns the index of the team with the smallest difference 
    between 'for' and 'against' goals, in terms of absolute value. 

    Arguments: parsed_data is a list of lists of cleaned strings 
    Returns: integer row index 
    """ 
    net_goals = [] 

    for i in goals[1:]: 
     net_goals.append(abs(int(i[5]) - int(i[6]))) 

    return net_goals.index(min(net_goals))+1 
+0

ようこそStackOverflow!あなたは本当にきれいに言葉の質問をまとめました。さらに、問題のチャレンジへのリンクは、ここでのあなたの書き込みをうまく補うでしょう。 –

答えて

0

これはまさに答えではありませんが、代わりにあなたの解決策に関するコメントがあります。

csvファイルを行単位で読み込んでリストに入れるだけの行を使っています(後であなたが項目ごとに処理します)。後でスキップする特別なロジックがありますヘッダー行。あなたが代わりにcsv.DictReaderを使用し、それを最初にリストに読み込むのではなく、直接結果のイテレータを使用すれば、あなたのソリューションははるかに簡単になります。あなたはそれを注意しましょう

{'Draws': '3', 'Wins': '26', 'Losses': '9', 'Goals Allowed': '36', 'Points': '87', 'Games': '38', 'Goals': '79', 'Team': 'Arsenal'} 
{'Draws': '6', 'Wins': '24', 'Losses': '8', 'Goals Allowed': '30', 'Points': '80', 'Games': '38', 'Goals': '67', 'Team': 'Liverpool'} 
{'Draws': '9', 'Wins': '24', 'Losses': '5', 'Goals Allowed': '45', 'Points': '77', 'Games': '38', 'Goals': '87', 'Team': 'Manchester United'} 
... 

:これはあなたの線に沿って何かを表示します

with open('football.csv', 'rt') as ifile:          
    footballTable = csv.DictReader(ifile)          
    for row in footballTable:             
     print row 

:の出力を考えてみましょう

  • ヘッダー行は自動的に処理され
  • コードでマジックインデックス(i[5])を使用する必要がなく、名前で列を参照できるようになりました。つまり、i['Goals']またはi['Goals Allowed']を求めることができます。

ループ内に2行だけ追加するだけで、おそらく問題の解決策が得られます。