数据解析,pythonic方式

2024-09-29 00:23:14 发布

您现在位置:Python中文网/ 问答频道 /正文

内部固定装置.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
...

Tags: 方法intxtnewifcheevefixtures
1条回答
网友
1楼 · 发布于 2024-09-29 00:23:14

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

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

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作为临时存储,但我认为这段代码可能更容易阅读。你知道吗

相关问题 更多 >