数据解析,pythonic方式

时间:2015-06-17 10:52:16

标签: python python-2.7

Inside fixtures.txt是下赛季英超联赛的内容。数据如下所示:

foo@ubuntu:~/Desktop$ less fixtures.txt |head -n 4
8 August 2015
AFC Bournemouth v Aston Villa    #BOUAVL
Arsenal v West Ham United    #ARSWHU
Chelsea v Swansea City    #CHESWA

我想为每支球队排名。我的方法看起来非常糟糕,包括一堆行。什么是更有效的方法呢?

teams = {'BOU' : 4, 'WAT' : 4, 'LEI' : 4, 'NOR' : 4, 'AVL' : 3, 'SUN' : 3, 'NEW' : 3, 'WBA' : 3, 'STK' : 2, 'SWA' : 2, 'EVE': 2, 'SOU' : 2, 'CPL' : 2, 'TOT': 2, 'ARS' : 1, 'CHE' : 1, 'MUN' : 1, 'LIV' : 1, 'MCI' : 1}

fd = open("fixtures.txt", "r")

for lines in fd:
lines = lines.strip()
matches = lines.split("#")
if "CHE" in lines:
    for k,v in teams.items():
        if k in matches[1]:
            if "CHE" not in k:
                print k,v

输出(切尔西的第一场比赛):

SWA 2
MCI 1
WBA 3
EVE 2
ARS 1
NEW 3
SOU 2
...

1 个答案:

答案 0 :(得分:2)

什么是最好的取决于您需要处理多少数据。在这种情况下,问题的一半是数据检索和打印都混乱了。除非您正在处理大量数据,否则建议将它们拆分。

如果数据量很小(少于几百个匹配),您可以将所有数据读入列表,如下所示:

teams = {'BOU' : 4, 'WAT' : 4, 'LEI' : 4, 'NOR' : 4, 'AVL' : 3, 'SUN' : 3, 'NEW' : 3, 'WBA' : 3, 'STK' : 2, 'SWA' : 2, 'EVE': 2, 'SOU' : 2, 'CPL' : 2, 'TOT': 2, 'ARS' : 1, 'CHE' : 1, 'MUN' : 1, 'LIV' : 1, 'MCI' : 1}

def read_fix(filename):
    """Reads a named fixtures-file and returns a list containing pairs of team names [["BOU","AVL"],["ARS","WHU"],...]"""
    matches=[] #create an empty list, this is part of a so called accumulator pattern
    with open(filename, "r") as fd:   #The with statement guarantees that the opened file is closed when the block ends.
        for line in fd:
            line = line.strip().split("#")  #You can chain multiple method-calls on one line, this does both white-space-stripping and splitting on #.
            if len(line)==2:   #Filter out only lines that contain a game (or well exactly one #, possibly dangerous)
                teams=line[1]  #Remember that python indexes lists and strings from 0
                matches.append([teams[0:3],teams[3:6]])  #split the part after the # into two parts, 3 letters each and add the pair to the list (this is the accumulation step of the accumulator-pattern)
    return matches

然后使用其他功能进行打印:

def print_fix(games,team):
    """Takes a list of games (as team-pairs) and prints information for the opposing team in each match that contains the specified team."""
    team=team.upper()  #just for convenience
    for game in games:
        if team in game:  #The in statement returns True if the team element is equal to at least one of the teams in the game-array.
            #For example: team in ["CHE","LIE"] would return true if team was either "CHE" or "LIE"
            if game[0] == team: #If "my team" is the first one of the pair, then the "Other team" must be the second, and the other way around.
                other=game[1]
            else:
                other=game[0]
            print other, teams[other]

matches= read_fix("fixtures.txt")
print_fix(matches,"CHE") 

一种更有效的方法是使用dict进行临时存储,但我认为这段代码可能稍微容易阅读。

相关问题